101のサブフォルダを含むフォルダがありますsimulations
。これらのサブフォルダのposterior_predictive_sim_1
名前はですposterior_predictive_sim_101
。
各サブフォルダには、、、およびseq.nex
5seq[1].nex
つのファイルが含まれています。seq[2].nex
seq[3].nex
seq[4].nex
各サブフォルダからseq[1].nex
、、、seq[2].nex
およびseq[3].nex
ファイルを削除したいと思います。seq[4].nex
seq.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
コマンドには適用されません。for
echo
また、まずテストを行う/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