在linux命令行中find转义问号

出于某种原因,我想删除所有文件名称,如“* .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\\\? …现在你明白为什么我更喜欢单引号。