这是基于这里的问题。
问题:
方法,其中filelist.txt包含我要复制的文件名(用\ n分隔):
# version 1
for file in $(cat filelist.txt); do cp "$file" newfolder; done
错误:
如果我在filelist.txt中有包含破折号,空格等的文件名,则名称会被拆分,并且我会正确地得到一个No such file
错误。
这是我尝试解决的方法(在变量中添加dbl引号):
# version 2
for file in "$(cat filelist.txt)"; do cp "$file" newfolder; done
但这会打印出所有文件名(在空白处不分割),并且不复制任何内容。
问题:
如上添加引号可解决名称拆分问题,例如当我将其提供给echo
;时。为什么不起作用cp
?
什么是这样做的正确的方式cat
和cp
?上面链接的答案中的注释建议以下内容:
set -f;IFS=$'\n'
可以解决问题,但我不知道它能做什么。
任何提示,不胜感激!
有很多选择。这是一:
cat filelist.txt | while read file; do
cp "$file" newfolder
done
所以,首先为什么
for file in $(cat filelist.txt); do cp "$file" newfolder; done
不行?假设您的文件列表包含
a
b c
该$(cat filelist.txt)
产生的文件名列表。for循环看到的输出cat
并将其解释为:
for file in a b c ; do
这显然不是目的。
这是有关“输入字段分隔符”的注释的帮助之处。通常,IFS是任何空格,因此文件名中的空格将被解释为文件名之间的分隔。如果将IFS显式设置为换行符,则不再将空格视为分隔符。
for file in "$(cat filelist.txt)"; do cp "$file" newfolder; done
为for循环创建一个参数。结果等于:
for file in "a b c" ; do
因此,该循环仅使用不存在的文件名执行一次。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句