出于某种原因,我想删除所有名称类似“*.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 扩展,而不是由您将它们作为参数传递给的命令扩展。
在 的特定情况下find
,find
还接受通配符。因此,您有将它们转义到 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\\\?
...现在你知道我为什么更喜欢单引号了。