我有档案
..
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
为此添加了名称)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句