Linux

通過子字元串文件名批量重命名文件

  • July 28, 2018

我有文件

..
00016_0912RP10R6_RampMotorway9_0912RP10R6_13.646852_100.687103.jpg
00017_0912RP10R6_RampMotorway9_0912RP10R6_13.646956_100.686897.jpg
00018_0912RP10R6_RampMotorway9_0912RP10R6_13.647067_100.686684.jpg
...

我想擁有

00016.jpg
00017.jpg
00018.jpg

循環子文件夾並重命名它的最佳linux命令是什麼?

使用find

find . -type f -name '*_*.jpg' -exec sh -c '
   for pathname do
       newname=${pathname##*/}
       newname="${pathname%/*}/${newname%%_*}.jpg"
       printf "Would move %s to %s\n" "$pathname" "$newname"
       # mv -i "$pathname" "$newname"
   done' sh {} +

這將找到名稱與給定模式匹配的目前目錄中或目前目錄下的所有正常文件的路徑名。對於這些路徑名的批次,將執行一個簡短的 shell 腳本,循環遍歷給定的路徑名並重命名文件(為安全起見,實際的重命名已被註釋掉)。

給定一個類似的路徑名./a/b/c/foo0_some_other_bits.jpg,shell 腳本將./a/b/c/foo0.jpg通過首先刪除目錄(生成foo0_some_other_bits.jpg)然後刪除第一個_字元之後的所有內容並再次添加目錄來將其轉換為。路徑名的目錄位被刪除和替換,以防它也恰好包含一個或多個_字元。這是使用標準參數擴展完成的。

使用globstarshell 選項bash

shopt -s globstar   # use "set -o globstar" in ksh93, or remove completely in zsh
for pathname in ./**/*.jpg; do
   [ -f "$pathname" ] || continue
   newname=${pathname##*/}
   newname="${pathname%/*}/${newname%%_*}.jpg"
   printf "Would move %s to %s\n" "$pathname" "$newname"
   # mv -i "$pathname" "$newname"
done

這完全等同於上面的find命令,唯一的區別是它不會找到隱藏的名稱(shopt -s dotglob為此添加)。

引用自:https://unix.stackexchange.com/questions/457427