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