同じプレフィックスを持つ複数のファイルを削除する(引数リストが多すぎます)

同じプレフィックスを持つ複数のファイルを削除する(引数リストが多すぎます)

ここで提供された答えを試してみましたが、うまくいかないようです。以下は、CentOSシステムのこのディレクトリからindex.phpプレフィックスが付いたすべてのファイルを削除しようとしたコマンドです。最初の2人は逃げているようだったが、何もしなかったのですか?

$ 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

-deletexargsオプションを使用する代わりに、ファイルを並列に削除することもできます。場合によっては、大容量ファイルコレクションの場合、それらを削除するとプロセス全体が高速化される可能性がありますが、必ずしもそうではありません。

rm100呼び出しごとの最大ファイル数を使用して、各コア/ CPUでコマンドを実行します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

または単にシェルループを実行してください:

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

上記のシェルループは次のとおり-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_

関連情報