我的项目根目录中有一个 bash 文件,其中包含这一行
$ ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f
上面的行.txt
从项目根目录中删除了所有文件,但是当我将所有 .txt 文件推送到另一个文件夹时,例如进程日志/并尝试使用相同的命令ls
,grep
但rm
它不起作用。
这是我尝试过但没有成功删除的文件进程日志目录。
$ 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
匹配完整的路径名,而不仅仅是末尾的文件名部分(这就是为什么我使用 将该表达式锚定到路径名的末尾$
)。另请参阅-regextype
GNUfind
手册中的选项。