我已经尝试使用此处给出的答案,但它似乎不起作用。以下是我尝试删除 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 f
像find
.要做到这一点:
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_