find ..
我知道当您由于“奇怪”的文件名而遇到将例如输出管道传输到的问题时,使用特定的分隔符(例如)来实际传递完整的文件名(例如)xargs
会有所帮助。并且,引用有问题的字符串以指定它们的边界“总是”有帮助的。\0
find foldername/ -type f -print0 | xargs -0 ...
但是,如果这些字符串(文件名)包含 bash 敏感字符'
(如,,,,,"
.. ?)并且您想使用一个字符串两次(即必须使用,并且需要在嵌套命令中注入这些字符串(即)?`
(
sh -c ..
$(CMD)
例如:
# create a file which should not exist but does
mkdir remove_afterwards
touch remove_afterwards/"some [\"strange\"] ('file')"
# this will work
find remove_afterwards/ -type f -print0 | xargs -0 -I{} sh -c 'echo "{}"'
# but this won't due to the nested command
find remove_afterwards/ -type f -print0 | xargs -0 -I{} sh -c 'echo "{}" $(stat -c "%s" "{}")'
stat: cannot statx 'remove_afterwards/some [strange] ('\''file'\'')': No such file or directory
remove_afterwards/some [strange] ('file')
我还没弄清楚如何逃离第二个{}
里面$()
。
有办法吗?
不可否认,一些具有功能的真实脚本会使这一切更容易编写和阅读,但我很好奇,历史上有这样一行代码值得努力去写这个问题。