文件中每一行的 Unix 副本

pre*_*lic 3 unix cp

我有一个文件file_copy,其中有:

>cat file_copy
file1
file2
file3
Run Code Online (Sandbox Code Playgroud)

我想复制file1, file2,file3/source/dest。我知道如何做到这一点的一种方法是:

for line in `cat file_copy` ; do cp /source/$line /dest; done
Run Code Online (Sandbox Code Playgroud)

但我知道有更好的方法,可能使用 find/xargs 和/或 awk 等。这样做的首选方法是什么?

slh*_*hck 8

迭代文件中的行的最佳方法是使用while

while read line; do cp /source/"$line" /dest/; done < file_copy
Run Code Online (Sandbox Code Playgroud)

虽然以上对于大多数情况来说已经足够了,但更强大的解决方案(尽管很少需要)是:

while IFS= read -r line; do cp /source/"$line" /dest/; done < file_copy
Run Code Online (Sandbox Code Playgroud)

所述IFS=防止在一行的开始和结束被修剪空格。-r防止反斜杠被丢弃。


关于您的原始命令:

  • cat有一个无用的用途

  • 不应该阅读行,for因为当你的行包含空格时它很容易出错。在实践中,如果您发现自己使用的for不是循环 shell 生成的文件名(例如for f in *.csv),那么您可能做错了什么。

  • 您还应该引用您的变量以防止带空格的文件名被分解为多个参数。