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
答え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のコメントを参照してください。