我自己永远不会这样做,但使用 Windows 机器的人坚持在文件名中添加空格。
我已经编写了这个详细的命令,除了带有空格的文件外,它工作得很好。已经尝试了一切,单引号,双引号,刻度,反斜杠转义。
该命令应该从具有某些文件扩展名的目录中复制所有内容,但我不想复制的文件列表除外。不幸的是,其中一些文件包含空格。这是命令:
cp $(ls *.txt *.docx | grep --invert-match --fixed-strings \
-e not_this_one.txt \
-e not_this_one_either.docx \
-e "no not me.txt" \
-e "please leave me out as well.docx") ./destination_directory/
任何想法如何使这项工作?
使用
find
andxargs
代替$(...)
参数扩展:我们使用该
-prune
选项来排除我们不想复制的内容。我们
-print0
在 find 命令上使用来生成以 NUL 结尾的文件名,当通过管道传送到xargs -0
正确处理包含空格的文件名时。最后,我们使用
-t <target_directory>
on 选项,cp
因为这允许xargs
仅将文件名列表附加到命令(没有-t
,目标目录需要放在最后,这会使事情变得有点复杂)。或者,使用
tar
:(当然,您可以将排除模式列表放入文件中并使用
--exclude-from
。)一旦您向
ls *.txt *.docx
tru 发送管道|
,shell 就会生成一个不分隔文件的字符串。好吧,它们可以用空格(或换行符)分隔,这会导致下一个尝试在空格(或换行符)上使用这种字符串拆分文件名的工具混淆。由于您使用 bash 标记问题,因此 glob 的扩展
*.txt
由*.docx
shell (bash) 完成,并且 bash 能够拒绝 GLOBIGNORE 中给出的某些文件模式,您可以简单地执行以下操作:这
(...)
是为了确保一旦关闭子shell,GLOBIGNORE 的设置就会被删除。当然,您可以删除它并做一个unset GLOBIGNORE
之后。回显在那里向您显示命令的结果。如果您对得到的结果感到满意,请移除回声。