文件中每一行的 Unix 副本

文件中每一行的 Unix 副本

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

>cat file_copy
file1
file2
file3

我想将file1, file2,file3从复制/source/dest。我知道的一种方法是这样做:

for line in `cat file_copy` ; do cp /source/$line /dest; done

但我知道有更好的方法,可能使用 find/xargs 和/或 awk 等。执行此操作的首选方法是什么?

答案1

遍历文件中各行的最佳方法是使用while

while read line; do cp /source/"$line" /dest/; done < file_copy

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

while IFS= read -r line; do cp /source/"$line" /dest/; done < file_copy

防止IFS=在行首和行末修剪空格。-r防止丢弃反斜杠。


关于您的原始命令:

  • 有一个猫的无用用途

  • 不应该读for因为当行中包含空格时,它很容易出错。实际上,如果您发现自己使用了for除循环遍历 shell 生成的文件名之外的其他任何内容(例如for f in *.csv),则您可能做错了什么。

  • 您还应该用引号括住变量,以防止带有空格的文件名被拆分成多个参数。

答案2

为了提高性能,您可以考虑这样做:

tar -cf -  'cat source.txt' | (cd $dest ; tar -xf -)

压缩源内的文件并提取它们会比循环更快地完成工作!

相关内容