Unix for 循环不工作

Unix for 循环不工作

我有一个简单的 bash 脚本。全氟反馈:

CWD=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $CWD
for i in `cat req_files.txt`
do
echo "file_found : $i">a.txt
done

注意:req_files.txt 有一个我需要在此目录中找到的文件列表。如果找到文件,它应该列出找到的文件的名称并将其打印在“a.txt”中。

req_files.txt 有多个文件,但仅打印第一个文件名,而不打印其余文件。请帮忙。

答案1

您似乎每次循环都会覆盖 a.txt 的内容。

echo "file_found : $i">a.txt

应替换>>>.

或者将其放置在完成之后,以避免每次都打开和关闭它。将其添加到其他答案中以给出

done < req_files.txt > a.txt

我将其保留为仅打开而不是附加,因为它不需要保存到目前为止所显示的任何内容。

答案2

如果你想从文件中读取哪些行包含空格/制表符/等,你必须使用while循环而不是for

CWD=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $CWD
while read i
do
echo "file_found : $i">a.txt
done < req_files.txt

答案3

您的代码不包含用于在给定目录中搜​​索并将该目录内的文件与给定文件 (req_files.txt) 进行比较的行。您所做的就是继续覆盖(因为您使用的是>运算符,>>所以使用追加)文件 a.txt 与 req_files.txt 的内容逐一覆盖,当脚本完成运行时,您只剩下最后一项写入a.txt。

据我了解,您的目标是:

搜索并列出给定路径内的所有文件。然后将该列表与 req_files.txt 中列出的文件进行比较。最后,在输出文件 a.txt 中列出匹配的内容。在这种情况下,下面的代码可以为您完成:

cwd=/cygdrive/c/Users/abhisek.samanta/Desktop/New_folder
cd $cwd #change dir to the required path
>a.txt  # create output file a.txt
for file in `ls`:
do
        grep "`echo "$file"`" req_files.txt >> a.txt
done

在 for 循环中,您现在使用 ls 命令列出文件。该脚本将在给定路径内创建一个文件 a.txt,其中包含该给定路径中存在的 req_files.txt 中的文件。

答案4

您将在循环的每次迭代中截断(清空)输出文件。

您还循环遍历 的输出cat,这很危险,因为 shell 会在空格、制表符和换行符(默认情况下)上分割输出,并对结果执行文件名通配。如果一行显示*,它将被当前目录中的所有文件名替换。

反而:

cd /cygdrive/c/Users/abhisek.samanta/Desktop/New_folder || exit 1

while IFS= read -r line; do
    printf 'File found: %s\n' "$line"
done <req_files.txt >a.txt

这将从文件中读取req_files.txt并将循环的输出写入a.txt.a.txt在将输出写入文件之前,该文件将被截断。如果不存在,则会创建它。

你愿意吗附加输出到已经存在的文件,使用>>而不是>.

也可以看看:

相关内容