Bash - 重新命名包含給定正規表示式模式的所有文件

Bash - 重新命名包含給定正規表示式模式的所有文件

我的目錄中有一些文件,它們都包含字串“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

相關內容