Nam*_*los 3 command-line directory rm files delete
我有一个名为 的文件夹simulations
,其中包含 101 个子文件夹。这些子文件夹被命名posterior_predictive_sim_1
为posterior_predictive_sim_101
.
每个子文件夹包含五个文件:seq.nex
、seq[1].nex
、seq[2].nex
、seq[3].nex
和seq[4].nex
。
我想从每个子文件夹中删除文件seq[1].nex
、seq[2].nex
、seq[3].nex
、 和seq[4].nex
(以便仅seq.nex
保留)。
我如何从命令行执行此操作?
只需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 内置命令,如for
或echo
。
/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 次 |
最近记录: |