MacOS下如何复制文本文件中含特殊字符的指定文件?
解决带空格和单引号的M4B文件批量复制问题
问题根源
- 首次报错
xargs: unterminated quote:xargs默认按空格、引号等字符分割参数,文件名里的单引号会被当成引号配对的起始标记,导致xargs认为引号未闭合,解析失败。 - 加引号后报错
cp: ... is not a directory:手动给文件名加引号后,xargs会把带引号的字符串完整传给cp,但实际文件路径并不包含引号,cp找不到对应文件;同时如果xargs一次性传递多个文件,错误的参数顺序会让cp误把源文件当成目标目录。
有效解决方案
方案1:用while循环(最稳妥,适配所有特殊字符)
直接逐行读取文件路径,用双引号包裹路径避免解析错误:
while IFS= read -r file_path; do cp "$file_path" /destination/folder/ done < /path/to/file/filenames.txt
IFS=:防止路径开头/结尾的空格被截断;read -r:禁止转义反斜杠,保证路径原样读取;"$file_path":双引号包裹路径,正确处理空格、单引号等特殊字符。
方案2:用xargs按行处理
如果你的filenames.txt是每行存储一个文件路径,用BSD xargs的-L1选项强制每次处理一行,配合cp -t指定目标目录(避免参数顺序问题):
cat /path/to/file/filenames.txt | xargs -L1 cp -t /destination/folder/
或者用-I指定替换符,并用双引号包裹:
cat /path/to/file/filenames.txt | xargs -I {} cp "{}" /destination/folder/
方案3:Null分隔符适配(适合生成文件列表时控制格式)
如果生成filenames.txt时可以用null字符分隔路径(比如用find ... -print0输出),可以用xargs的-0选项处理:
cat /path/to/file/filenames.txt | xargs -0 cp -t /destination/folder/
这种方式能处理所有特殊字符,包括换行符,但要求文件列表必须是null分隔格式。
内容的提问来源于stack exchange,提问作者Saro
相关产品推荐
相关产品推荐

