我有一个简单的 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
在将输出写入文件之前,该文件将被截断。如果不存在,则会创建它。
你愿意吗附加输出到已经存在的文件,使用>>
而不是>
.
也可以看看: