如何使用子目录名称和自动编号重命名所有子目录中的所有文件。
前任:
parent
-subdir
--file.jpg
--cat.jpg
--dog.jpg
重命名为:
parent
-subdir
--subdir_01.jpg
--subdir_02.jpg
--subdir_03.jpg
我正在使用这个脚本,但它不是递归的
#!/bin/bash
a=1
b="$1"
for i in *.jpg; do
new=$(printf "%04d" ${a}) #04 pad to length of 4
mv "${i}" ""$1"_${new}.jpg"
let a=a+1
done
答案1
这一句就可以做到:
find path/ -name '*.jpg' -exec bash -c 'dn=$(dirname "$1"); bn=$(basename "$dn"); c=$(ls "$dn/$bn"_??.jpg 2>/dev/null | wc -l); c=$((c+1)); cnt=$(printf "%02d" $c); mv "$1" "$dn/${bn}"_$cnt.jpg' -- {} \;
为了便于阅读,将行拆开:
find path/ -name '*.jpg' -exec bash -c '\
dn=$(dirname "$1"); bn=$(basename "$dn"); \
c=$(ls "$dn/$bn"_??.jpg 2>/dev/null | wc -l); c=$((c+1)); \
cnt=$(printf "%02d" $c); mv "$1" "$dn/${bn}"_$cnt.jpg' -- {} \;
答案2
我建议使用迭代方法而不是递归方法。要扫描(子)目录,请使用“查找”工具及其参数“-type d”。
例子:
find parentdir -type d | while read d ; do
a=1
# For example, $d could be "parent/subdir"
b="$(basename $d)"
# For above example, $b would be "subdir"
for i in "${d}/*.jpg" ; do
new=$(printf "%04d" ${a})
mv "${i}" "${d}/${b}_${new}.jpg"
let a=a+1
done
done
我还没有测试过代码,但它应该能让您很好地了解它应该是什么样子。潜在的问题可能是文件名中的空格;重新定义 IFS 可能会对您有所帮助。