選択したファイルを削除するbashスクリプト

選択したファイルを削除するbashスクリプト

C++ コードを実行すると、 に従って名前が付けられfield.%d.vtk、生成される一連のファイルがあります。コードは for ループ内で一連の計算を実行し、 がループ変数で が定数であるたびに出力をダンプします。誤って を設定してしまったためi%N == 0、必要のないデータが大量に生成されてしまいました。また、コードを再実行したくありません。iNN = 1

すべてのNファイルのみを保持し、残りを削除し、残りのファイルの名前をfield.%d.vtk連続した番号になるように変更する bash スクリプトを作成するにはどうすればよいでしょうか。これは些細なことかもしれませんが、私は bash スクリプトの経験が非常に限られています。

編集: N=1(誤って) の範囲%dが [0, 1, ..., O(100,000)] (非常に大きい)になる場合、適切な は、ファイル数を O(1000) 程度に縮小するものNです。N=100

ありがとう

答え1

N=100の場合、削除するのは非常に簡単です。次のコードは、00.vtkで終わらないファイルを削除します。

find -name '*.vtk' -not -name '*00.vtk' -exec rm {} +

つまり、100.vtk、200.vtkなどが残ります。

次に、連続させるために、00 を削除します。

rename 00.vtk .vtk *.vtk

これは標準の posix rename を前提としています。perl rename がインストールされている場合は次のようになります。

rename 's/00.vtk/.vtk/' *.vtk

答え2

for i in *.vtk
do
    [[ $i =~ \.([0-9]*)\. ]] && ((BASH_REMATCH[1] % 100 != 0)) && echo $i
done

このコマンドを再確認したら、echoに変更してください。rm

答え3

Paul の回答の Bash(4+) のみのバージョン (つまり、 で終わる .vtk ファイルの 100 個ごとに のみ残し、 を00.vtk削除して名前を変更します00)。

shopt -s extglob
rm ./!(*00).vtk
for f in ./*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done

再帰性が必要な場合:

shopt -s extglob globstar
rm ./**/!(*00).vtk
for f in ./**/*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done

関連情報