我有一系列文件,這些文件是根據field.%d.vtk
我運行 C++ 程式碼時生成的命名的。這些程式碼在 for 迴圈內執行一系列計算,並i%N == 0
在i
迴圈變數和N
常數時轉儲輸出。我錯誤地設定了N = 1
,現在我有大量不需要的數據。我也不想重新運行程式碼。
我怎麼能編寫一個 bash 腳本來只保留每個N
文件,刪除其餘文件,並重命名剩餘文件以使其中的數字field.%d.vtk
是連續的?抱歉,如果這是微不足道的,但我對 bash 腳本編寫的經驗非常有限。
編輯:當N=1
(錯誤地)範圍%d
在 [0, 1, ..., O(100,000)] (非常大)時,適當的N
東西N=100
會將檔案數量減少到 O(1000) 左右。
謝謝
答案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 重命名。如果您安裝了 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+) 版本(因此,它只會留下每 100 個文件 .vtk 文件,那些以 結尾的文件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