我需要递归删除所有具有以下十六进制内容的文件:\xDE\xAD\xBA\xAD
您能否建议一个可以执行该操作的终端命令?
答案1
要找到这些文件,您可以使用以下命令:
LC_ALL=C grep -Fral $'\xDE\xAD\xBA\xAD'
设置LC_ALL=C
是一种安全措施,以确保不会出现多字节行为或任何其他异常情况。虽然它可能会加快操作速度,但可能不需要。
grep
搜索符合特定模式的文件。
-F
告诉它该模式是一个简单的字符串而不是正则表达式。这里不需要它,但如果您的模式包含在正则表达式中具有特殊含义的字符,则需要它。
-r
告诉 grep 进行递归操作。
-a
告诉它处理所有文件(即使是它猜测是二进制的文件)。
-l
告诉它仅列出文件名,而不是匹配的行。
这四个选项的顺序无关紧要。
$'\xDE...'
告诉bash
您的命令行解释器在启动之前将这些实际字节放在命令行中grep
。也就是说,grep
已经看到了四个原始字节,而不是\xDE...
细绳。
如果您对试运行后的结果感到满意(强烈推荐),您应该添加另一个-z
选项,grep
以便其输出由 NUL 字符而不是换行符分隔,然后将输出通过管道传输到xargs
:
LC_ALL=C grep ... -z ... | xargs -0 rm -i --
xargs
将它从标准输入中看到的所有值传递到-i
命令的参数中。
xargs
's-0
对应于grep
's -Z
:输入预计以 NUL 分隔。
rm
's-i
使rm
交互成为可能,如果您绝对确定要删除所有此类文件而无需确认,请删除此项,您确切知道自己在做什么,您确实有备份,并且您已经验证我没有在这里犯一个可能导致意外删除文件的重大错误。:-)
rm
确保不会将其任何剩余参数处理为命令行参数,以防 的第一个匹配项是一个以 开头的文件--
名。rm
grep
-
答案2
首先运行 grep 命令来查看感兴趣的文件:
grep -REl '\\xDE\\xAD\\xBA\\xAD' /path/to/file/location/
然后使用rm
:
rm -rf $(grep -REl '\\xDE\\xAD\\xBA\\xAD' /path/to/file/location/)
信息:
-R
:用于使用 grep 搜索位置
-E
:grep 的扩展正则表达式选项
\
:greps 正则表达式转义字符,用于确保\
包含在搜索中。
-l
:grep 的选项列出找到所述模式的文件