使用 ls grep 和 rm 删除目录中的文件

使用 ls grep 和 rm 删除目录中的文件

我的项目根目录中有一个 bash 文件,其中包含这一行

$ ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

上面的行.txt从项目根目录中删除了所有文件,但是当我将所有 .txt 文件推送到另一个文件夹时,例如进程日志/并尝试使用相同的命令lsgreprm它不起作用。

这是我尝试过但没有成功删除的文件进程日志目录。

 $ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

注意:我也尝试过使用简单正则表达式模式的命令,比如 ls process_logs/ | grep -P '^*.txt$' | xargs rm -f从目录中删除文件,但它不起作用。

答案1

尝试使用find替代。如果您不想find递归,可以使用深度选项:

find /process_logs -maxdepth 1 -mindepth 1 -type f -name 'some_shell_glob_pattern_here' -delete

ls不建议解析 的输出,因为ls它并不总是准确的,因为ls打印的文件名的人类可读版本可能与实际文件名不匹配。欲了解更多信息,请参阅解析 ls维基文章。

答案2

我同意使用 find 是更好的选择。但我想补充一下为什么你的命令不起作用。

您的命令:

$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

ls输出文件名没有路径。但您没有添加 的路径rm。因此它会尝试从当前/根目录的子目录中删除文件名。

尝试

$ cd process_logs/; ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

或者

$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs -i rm -f "process_logs/{}"

答案3

如果您有一个简单的 shell 文件名通配模式,只需使用它即可。

例如(*可以用一些更精确的模式代替),

rm -f process_logs/*.txt

或者,如果有数十万个文件,请使用xargs

printf '%s\0' process_logs/*.txt | xargs -0 rm -f

如果你绝对需要要使用正则表达式,GNUfind可以使用

find process_logs -maxdepth 1 -type f -regex '\.txt$' -delete

请注意,谓词-regex匹配完整的路径名,而不仅仅是末尾的文件名部分(这就是为什么我使用 将该表达式锚定到路径名的末尾$)。另请参阅-regextypeGNUfind手册中的选项。

相关内容