用于复制带空格的文件列表的 Shell 脚本

用于复制带空格的文件列表的 Shell 脚本

我正在尝试创建一个采用文件名的小脚本,其中列出了文件的绝对位置,并将其复制到其他位置。

文件内容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

(如果有大量文件需要复制,这也有利于解决参数大小的限制)。

相关内容