コマンドラインから複数のサブフォルダにある同じ名前のファイルを削除する方法は?

コマンドラインから複数のサブフォルダにある同じ名前のファイルを削除する方法は?

101のサブフォルダを含むフォルダがありますsimulations。これらのサブフォルダのposterior_predictive_sim_1名前はですposterior_predictive_sim_101

各サブフォルダには、、、およびseq.nex5seq[1].nexつのファイルが含まれています。seq[2].nexseq[3].nexseq[4].nex

各サブフォルダからseq[1].nex、、、seq[2].nexおよびseq[3].nexファイルを削除したいと思います。seq[4].nexseq.nex

コマンドラインでこれを行うにはどうすればよいですか?

答え1

ただrm:

rm simulations/posterior_predictive_sim_*/seq\[[1-4]\].nex

エスケープされ\[\]文字通りの角括弧です。エスケープされていないコンテンツは、[1-4]数字1〜4に一致するglobパターンです。

これは、グローバル拡張ファイル名の数が1つのコマンドラインに入ることができる数を超えない場合にのみ機能します。ARG_MAX制限 - オペレーティングシステムによって異なりますが、最新のLinuxでは約200万文字です。 ARG_MAXはなどの外部コマンドには適用されますが、などのシェル組み込みrmコマンドには適用されません。forecho

また、まずテストを行う/bin/echoよりは、お試しくださいrm。理由: 1. /bin/echo は安全で、何も削除しません。 2./bin/echoシェルに組み込まれているechoバージョンではなく外部コマンドであるため、合計コマンド長が<= ARG_MAXであることをテストします。

GNUの使用find:

find simulations/ -type f -name 'seq\[[1-4]\].nex' -delete

-lsまたはで実行することをお勧めします。-print 今後必要に応じて動作することを確認するには、次のように-delete実行します。-exec rm

または:

find simulations/ -type f -name 'seq\[[1-4]\].nex' -exec rm {} +

+findのいくつかの古代バージョンは述語の終わりをサポートしていないので、代わりに次のように-exec使用してください\;

find simulations/ -type f -name 'seq\[[1-4]\].nex' -exec rm {} \;

+との違いは、findを使用するときにできるだけ多くのファイル名引数をコマンドに\;入れようとすることです(再びARG_MAX)。を使用すると、ファイル名ごとに1回実行されます。これは明らかに+rm\;rmたくさん速度は遅いですが、まだ便利です(たとえば、ファイル名引数のみを使用するプログラムを実行する必要がある場合)。

ところで、\;それは特別なものではありませんfind。実際、それ自体はターミネーターとしてfind機能します。これはシェルがセミコロンを渡すことを確認するためのものです。つまり、シェルがこれをステートメントの終わりに解釈するのを防ぐためです。シェルのドアは改行またはセミコロンで区切られます。;-exec\find;find

答え2

まず、ファイルのリストが必要です。ls、、find...を使用してfdテキストファイルとして保存できます。ls posterior_predictive_sim_*/ > all.txt人々はlsの構文解析について文句を言います。 tl;dr はここでは重要ではありません。

その後、実際に削除したいファイルをフィルタリングしたいと思います。 (cat all.txt | grep -v 'seq.nex' > del.txtシェルがより保守的な正規表現パターンを受け入れるようにすることもできますseq[\d+]\.nex)。

今開いてdel.txt本当にすべてを削除したいことを確認してください。必要に応じてファイルを手動で編集できます。

最後に実際に削除してください。rm一度に複数のファイル名を取得できるので、何千ものファイルがない場合は、この方法を試してみてください。私はGNU Parallel:を使うのが好きですcat del.txt | parallel --dry-run rm {}。実行したい実際のコマンドを印刷し、--dry-run実際に実行するには削除します。

エッジに住みたい場合は、ファイルに保存するのではなく、これらのコマンドをすべて互いにパイプすることもできます。誤ってrmファイルを回復できないことを願っています。しかし、使用https://github.com/andreafrancia/trash-cli代わりに、ファイルの削除をキャンセルできます。

答え3

ループを使用してください。

for i in $(ls); do rm posterior_predictive_sim_$i/seq\[*.nex; done


私自身と他の人になぜできないのかを思い出させるためにこれを残します。下記のCASのコメントを参照してください。

関連情報