我正在尝试创建一个采用文件名的小脚本,其中列出了文件的绝对位置,并将其复制到其他位置。
文件内容test.txt
例如:
/home/public/Music/Disk/GameOfThrones/Season1/01 Main Title.mp3
脚本尝试:
for file in `cat test.txt`; do cp "$file" temp ; done
但是,该脚本认为存在三个文件。更多搜索产生以下文件:
OIFS="$IFS"
IFS=$'\n'
for file in `cat test.txt`; do cp "$file" temp ; done
IFS="$OIFS"
这似乎用换行符替换每次出现的字母“n”。
那么如何正确去做呢?
答案1
使用while
带有read
, not 的循环for
:
while read -r file ; do
cp "$file" temp
done < test.txt
答案2
split+glob 运算符(`...`
或其新形式)不加引号。$(...)
分割部分$IFS
默认是针对 SPC、TAB 和换行符进行分割。在这里,您只想在换行符上分割,而不需要全局部分。所以就是:
IFS='
' # split on newline only. IFS=$'\n' also works in some shells
set -o noglob # disable the glob part
cp -- $(cat test.txt) temp/
由于zsh
具有明确的分裂算子,因此可以简化为:
cp -- ${(f)"$(cat test.txt)"} temp/
使用 GNU 工具,您还可以执行以下操作:
xargs -d '\n' -ra test.txt cp -t temp
(如果有大量文件需要复制,这也有利于解决参数大小的限制)。