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 次 |
| 最近记录: |