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

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

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

おすすめ記事