Linux
通過子字元串文件名批量重命名文件
我有文件
.. 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
)然後刪除第一個_
字元之後的所有內容並再次添加目錄來將其轉換為。路徑名的目錄位被刪除和替換,以防它也恰好包含一個或多個_
字元。這是使用標準參數擴展完成的。使用
globstar
shell 選項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
為此添加)。