【问题标题】:Take a list of names from a text file and compare them with a list of directories in Bash从文本文件中获取名称列表并将它们与 Bash 中的目录列表进行比较
【发布时间】:2022-04-03 09:10:34
【问题描述】:

我正在尝试从文本文件中获取名称列表并将它们与目录列表进行比较。如果目录中有匹配项,则移动它们。

下面的代码不起作用,但它本质上是我想要实现的。

#!/bin/bash

echo \"Starting\"

names=\"names.txt\"

while IFS= read -r directory; do
        find \'Folder/\' -type d -name \'$directory\' -print0
done < \"$names\" | xargs -t mv Folder/ MoveTo/

示例文件夹结构:

Folder/
 folder1
 folder2
 folder3
 oddfolder
 oddfolder2

MoveTo/
(empty)

示例文本文件结构:

 folder1
 folder2
 folder3

输出期望:

Folder/
 oddfolder
 oddfolder2

MoveTo/
 folder1
 folder2
 folder3

我没有空格或大写的问题。如果匹配,那么我想将选定的文件夹移动到不同的文件夹。

    标签: bash directory find compare


    【解决方案1】:

    这应该有效:

    $ tree
    ├── folder
    │   ├── f1
    │   ├── f2
    │   ├── f3
    │   ├── f4
    │   ├── other1
    │   └── other2
    ├── name.txt
    └── newdir
    
    $ cat name.txt 
    f1
    f2
    f3
    f4
    
    $ while IFS= read -r dir; do 
      mv "folder/$dir" newdir/. 2>/dev/null
    done < name.txt
    
    $ tree
    .
    ├── folder
    │   ├── other1
    │   └── other2
    ├── name.txt
    └── newdir
        ├── f1
        ├── f2
        ├── f3
        └── f4
    

    请注意,您还应该使用"代替'有变量

    【讨论】:

    • 我尝试了两种解决方案。当我设置src="Folder/" 时,第一个答案似乎没有在文件夹中循环。当我在 while 循环中 echo "Folder/" 时,它只会打印出 "Folder/" 我尝试使用 * 并执行 ls Folder 而不是给出路径。我什至将文件夹移到了脚本文件所在的位置,但没有移动任何内容。
    【解决方案2】:

    您不必在while 循环内执行find 命令。 测试[[ -d dirname ]]足以确认存在 的目录。请你试试:

    #!/bin/bash
    
    names="names.txt"
    src="Folder"
    dest="MoveTo"
    
    while IFS= read -r dir; do
       [[ -d $src/$dir ]] &&  mv "$src/$dir" "$dest"
    done < "$names"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多