在UNIX中列出文件然后使用循环

时间:2014-12-02 11:25:11

标签: bash unix

我在名为list的文件中有一个目录名列表。对于列表中的每个名称,我需要转到该目录并检查文件模式,然后将它们移动到相同的目录名但在另一个路径中。我做到了这一点。在这里我列出'list1',然后对于list1中的每个名称,我将在/ a / b / c / d下找到该目录并搜索带有No的文件模式并将它们移动到/ a / b / c下的相同目录名称/ R。

#!/bin/bash
FILES=/a/home/mydir/list1
for f in $list1
do
cd /a/b/c/d/$f
find . -type f -name "*No*" -exec mv {} /a/b/c/r/$f. \;
done

我得到以下输出:

  

./read.sh:line 5:cd:/ a / b / c / d // u / home / mydir / list1:路径名中的文件或目录不存在。   ./read.sh:line 6:cd:/ a / b / c / d // u / home / mydir / list1:参数必须是目录。   mv:/ a / b / c / d // u / home / mydir / list1。:路径名中的文件或目录不存在。   mv:/ a / b / c / d // u / home / mydir / list1。:路径名中的文件或目录不存在。   mv:/ a / b / c / d // u / home / mydir / list1。:路径名中的文件或目录不存在。   mv:/ a / b / c / d // u / home / mydir / list1。:路径名中的文件或目录不存在。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您正在寻址$list1,但这不是先前已分配值的变量。你还有一个未使用的变量FILES,它来自哪里?

尝试一下:

while read filename ; do
    cd /a/b/c/d/$filename
    find . -type f ... # etcetera
done < /a/home/mydir/list1

这将读取来自/a/home/mydir/list1的行,并且每次迭代将读取的内容分配给$filename。这个$filename在循环中用来做你应该做的任何事情。