用於刪除選定檔案的 bash 腳本

用於刪除選定檔案的 bash 腳本

我有一系列文件,這些文件是根據field.%d.vtk我運行 C++ 程式碼時生成的命名的。這些程式碼在 for 迴圈內執行一系列計算,並i%N == 0i迴圈變數和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

相關內容