Linux 命令行查找转义问号

Linux 命令行查找转义问号

出于某种原因,我想删除所有名称类似“*.jpg?”的文件(文件名以实数?结尾)

我试过这个

find /var/www/ -type f -name "*.jpg\?"

find /var/www/ -type f -name "*.jpg?"

但这不起作用我该怎么做?

答案1

有趣的是,你的两个命令在我手头的 CentOS 6.5 find 4.4.2 系统上都可以运行。你可以尝试使用单引号'

find /var/www/ -type f -name '*.jpg?'

如果此方法有效并且可用于 find,则可以使用 find 的 -delete 参数来删除文件。这样就不再需要 xargs 和 print0 等。不过,在添加删除之前,请务必确保 find 命令正常工作。

答案2

简短回答:

find /var/www -type f -name '*.jpg\?'

解释:

?有特殊的意义 最多 贝壳. 它是‘单个字符’通配符。

在 shell 上,这意味着它将扩展为任何字符,就像*扩展为任何字符串一样:

> echo *
1file 2file dir1 dir2 file1 file2
> echo ?
?
> echo file?
file1 file2

请记住,这些特殊字符将由您的 shell 扩展,而不是由您将它们作为参数传递给的命令扩展。

在 的特定情况下findfind还接受通配符。因此,您将它们转义到 shell 上以便 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,而不是*

如您所见,您可以使用反斜杠转义特殊字符,也可以用'单引号括起来。出于多种原因,我更喜欢单引号。(请注意,这适用于 bash、dash 和其他可能,但可能不是全部)。

现在您已退出?shell,但尚未退出 find。这通常不会造成麻烦,但如果您有一个file.jpga不想删除的文件,则可能会造成麻烦:

> find . -type f -name '*.jpg?'
./file1.jpg?
./file2.jpga
> find . -type f -name '*.jpg\?'
./file1.jpg?

另一种选择是find . -type f -name \*.jpg\\\?...现在你知道我为什么更喜欢单引号了。

相关内容