删除具有相同前缀的多个文件(参数列表太长)

删除具有相同前缀的多个文件(参数列表太长)

我已经尝试使用此处给出的答案,但它似乎不起作用。以下是我尝试删除 CentOS 系统上此目录中所有带有 index.php 前缀的文件的命令。前两个好像跑了但是什么也没做?

$ find . -prune -name 'index.php.*' -exec rm {} +
$ find . -prune -name 'index*' -exec rm {} +
$ rm index.php*
-bash: /usr/bin/rm: Argument list too long

答案1

假设我们有测试文件的测试数据集:

$ tree
.
├── index.php
├── index.php.bar
├── index.php.foo
├── keppme.php
└── level1
    ├── index.php
    ├── index.php.l1
    ├── keepme.php
    └── level2
        ├── index.php
        ├── index.php.foo
        └── keepme.php

删除所有以index.php:开头的文件

$ find . -type f -name 'index.php*' -delete

然后测试文件如下所示:

$ tree
.
├── keppme.php
└── level1
    ├── keepme.php
    └── level2
        └── keepme.php

删除那些在扩展后添加的内容.php(例如lindex.php.foo)但保留index.php

$ find . -type f -name 'index.php.*' -delete

然后测试数据显示:

$ tree
.
├── index.php
├── keppme.php
└── level1
    ├── index.php
    ├── keepme.php
    └── level2
        ├── index.php
        └── keepme.php

-delete您还可以选择xargs并行删除文件,而不是使用选项。有时,对于大文件集合来说,删除这可以加快整个过程,但并非总是如此。

rm在每个核心/CPU 上运行命令,100每次调用最大文件数rm

$ find . -type f -name 'index.php.*' -print0 | xargs -r0 -P $(nproc) -n 100 rm

答案2

我假设您只想删除index*删除当前的目录,这就是您使用-prune.

通过使用-prune使用全部找到路径名,您就可以有效地阻止find下降到.顶级搜索路径。因此,您的find命令都不会执行任何操作。

要删除index*当前目录中的所有文件(但不包括下面的文件),请使用标准

find . ! -path . -prune -type f -name 'index*' -exec rm {} +

或非标准

find . -maxdepth 1 -type f -name 'index*' -delete

或者,只需执行一个 shell 循环:

for name in ./index*; do rm "$name"; done

上面的 shell 循环不会-type ffind.要做到这一点:

for name in ./index*; do
   [ -f "$name" ] && [ ! -L "$name" ] && rm "$name"
done

或者,与zsh

for name in ./index*(.N); do rm $name; done

或者

autoload -U zargs
zargs -r -- index*(.N) -- rm --

...调用rm次数尽可能少。

答案3

在这种情况下

$ rm index.php*
-bash: /usr/bin/rm: Argument list too long

你可以试试这个

$ printf "%s\0" index.php* | xargs -0 rm

答案4

删除以特定名称开头的文件的命令:

a) rm -rf <file name>*   (in case it gives an error **Argument list too long** then use option b)

b) find . -type f -name '<file name>*' -delete

注意:在我的例子中,文件名以sess_

相关内容