出于某种原因,我想删除所有文件名称,如“* .jpg?” (文件名以真实结尾?)
我试过这个
find /var/www/ -type f -name "*.jpg\?"
和
find /var/www/ -type f -name "*.jpg?"
但这不起作用,我该怎么办?
有趣的是你的两个命令都可以在CentOS 6.5的4.4.2系统上运行。 你可以尝试使用单引号'
find /var/www/ -type f -name '*.jpg?'
如果这个工作正常并且在你的find中可用,你可以使用-delete参数来find删除这些文件。 这消除了对xargs和print0等的需求。 确保在添加删除之前确保find命令正常工作。
简短的回答:
find /var/www -type f -name '*.jpg\?'
说明:
?
在 大多数 炮弹中有特殊的意义。 这是“单个字符”的通配符。
在shell上,这意味着它将扩展到任何字符,很像*
展开为任何string:
> echo * 1file 2file dir1 dir2 file1 file2 > echo ? ? > echo file? file1 file2
请记住,这个特殊字符将会被你的shell扩展,而不是通过你传递给它们的命令来扩展。
在find
的特定情况下, find
也接受通配符。 因此,你必须在壳上逃脱,才能find它们。
让我以另一个例子来澄清:
> echo * dir1 file1 file2 > find dir1 -name * find: paths must precede expression: file1 > find dir1 -name \* dir1 dir1/test1 dir1/test2 > find dir1 -name '*' dir1 dir1/test1 dir1/test2
如果我不逃避*
, find
将收到echo
显相同的string,而不是*
正如你所看到的,你可以用反斜杠或者用'
单引号'
包围特殊字符。 我更喜欢单引号,原因很多。 (请注意,这适用于bash,破折号和其他人,但可能不是全部)。
现在你已经逃脱了?
从壳而不是从发现。 这通常不会造成麻烦,但是如果你有一个你不想删除的file.jpga
文件:
> find . -type f -name '*.jpg?' ./file1.jpg? ./file2.jpga > find . -type f -name '*.jpg\?' ./file1.jpg?
另一种select是find . -type f -name \*.jpg\\\?
find . -type f -name \*.jpg\\\?
…现在你明白为什么我更喜欢单引号。