如何从命令行删除多个子文件夹中的同名文件?

Nam*_*los 3 command-line directory rm files delete

我有一个名为 的文件夹simulations,其中包含 101 个子文件夹。这些子文件夹被命名posterior_predictive_sim_1posterior_predictive_sim_101.

每个子文件夹包含五个文件:seq.nexseq[1].nexseq[2].nexseq[3].nexseq[4].nex

我想从每个子文件夹中删除文件seq[1].nexseq[2].nexseq[3].nex、 和seq[4].nex(以便仅seq.nex保留)。

我如何从命令行执行此操作?

cas*_*cas 5

只需rm

rm simulations/posterior_predictive_sim_*/seq\[[1-4]\].nex
Run Code Online (Sandbox Code Playgroud)

转义的\[and\]是字面方括号。其中未转义的内容[1-4]是与数字 1 到 4 匹配的 glob 模式。

仅当 glob 扩展的文件名数量不超过一个命令行所能容纳的数量(即ARG_MAX限制)时,这才有效 - 这取决于操作系统,但在现代 Linux 上约为 200 万个字符。ARG_MAX 适用于外部命令,如rm,而不适用于 shell 内置命令,如forecho

/bin/echo另外,请使用而不是首先进行测试rm。因为: 1. /bin/echo 是安全的,不会删除任何东西。2./bin/echo是一个外部命令,不是 shell 内置版本的 echo,因此还将测试总命令长度是否 <= ARG_MAX。

使用 GNU find

find simulations/ -type f -name 'seq\[[1-4]\].nex' -delete
Run Code Online (Sandbox Code Playgroud)

我建议在使用(或-ls如下)运行它-print 之前运行它,只是为了验证它是否会执行您想要的操作。-delete-exec rm

或者:

find simulations/ -type f -name 'seq\[[1-4]\].nex' -exec rm {} +
Run Code Online (Sandbox Code Playgroud)

某些古老版本的 find 不支持+谓词末尾-exec,因此请改用\;

find simulations/ -type f -name 'seq\[[1-4]\].nex' -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

+和 之间的区别\;在于,使用 时+,find 尝试将尽可能多的文件名参数放入rm命令中(再次是 ARG_MAX)。使用 时\;,它对rm每个文件名运行一次 - 这显然要慢得多,但它仍然有用(例如,当您需要运行一个仅采用一个文件名参数的程序时)。

顺便说一句,\;对于 来说并不特别find。事实上,find它本身仅用;作 的终止符-exec。这\是为了确保 shell 将分号传递给find,即防止 shell 将 解释;为语句的结尾find。shell 语句由换行符或分号分隔。


归档时间:

查看次数:

1676 次

最近记录:

2 年,5 月 前