我的目錄中有一些文件,它們都包含字串“HG-U133A”或“HG-U133B”。我想編寫一個腳本,可以遍歷目錄中的所有文件,並重命名所有帶有“A_”前綴的“HG-U133A”文件,以及所有帶有“B_”前綴的“HG-U133B”文件。
所以如果這些是我的目錄中的文件
> grep "HG-U133[AB]" *
fileA.txt: HG-U133A
fileB.txt: HG-U133A
fileC.txt: HG-U133B
fileD.txt: HG-U133A
fileE.txt: HG-U133B
我想編寫一個可以將這些文件重命名為的腳本
> ls
A_fileA.txt
A_fileB.txt
B_fileC.txt
A_fileD.txt
B_fileE.txt
我真的很感激一些幫助。謝謝
答案1
這是一個便攜式解決方案,不屬於Bash 陷阱第 1 號。
for file in *; do
[ -f "$file" ] || continue
grep -q -- HG-U133A "$file" && { mv -- "$file" "A_$file"; continue; }
grep -q -- HG-U133B "$file" && mv -- "$file" "B_$file"
done
筆記:
*
與點文件不匹配,但您在grep
呼叫中使用了它,所以我假設該行為適合您或您知道如何更改它。*
確實符合目錄。您的grep
呼叫沒有可能使其處理目錄的選項。該腳本會跳過任何非常規文件的內容,其主要目的是跳過目錄並且不grep
為它們運行(無論如何都會失敗)。- 雙破折號 (
--
) 的解釋如下:--
(雙破折號)是什麼意思? (又稱「裸雙破折號」)?這是為了防止任何檔案名稱以破折號開頭。如果我們使用./*
而不是*
我們就不需要它。 - 你說“要么……或……”,我將其解釋為“對於給定文件,最多有一個字串匹配”。因此
continue
在第一個之後grep
。它的存在是為了不grep
徒勞地調用第二個。 - 如果您期望有很多文件,
HG-U133B
但只有很少的文件,HG-U133A
那麼請考慮先進行測試HG-U133B
。
優點:
- 可移植性,
- 魯棒性(無論檔案名稱如何,程式碼都應該正常運作)。
壞處:
- 每個常規文件至少產生一個
grep
進程遠非最佳;如果要檢查的文件過多,這可能會減慢速度。
答案2
以下命令bash
將執行此操作:
for file in `grep -l HG-U133A *` ; do mv "$file" "A_$file" ; done
for file in `grep -l HG-U133B *` ; do mv "$file" "B_$file" ; done