我可以在多个文件夹中以数字方式重命名文件。但是,这不是我要找的结果。我的文件结构如下:
Pictures-
Vacation-
img.001.jpg
img.002.jpg
img.003.jpg
Holidays-
img.004.jpg
img.005.jpg
img.006.jpg
Fun-
img.007.jpg
我想要达到的目标是:
Pictures-
Vacation-
img.001.jpg
img.002.jpg
img.003.jpg
Holidays-
img.001.jpg
img.002.jpg
img.003.jpg
Fun-
img.001.jpg
到目前为止,我已经提出以下建议:
a=1
for i in $vm/Holiday/*; do
new=$(printf "%03d.jpg" ${a})
mv ${i} $vm/Holiday/${new}
let a=a+1
done
如何在我的图片文件夹中的每个目录上单独运行此结果,如何实现我想要的结果?
答案 0 :(得分:1)
试试这个
ls > folders #cat top folders into folders
while read folder
do
cd $folder #go to vacation folder for example
i=0
ls *.jpg > files
while read line
do
mv $line img.$i.jpg #rename files according to your need
i=$(($i+1))
done < "files"
rm files
cd ..
done < "folders"
rm folders
答案 1 :(得分:1)
获取你的版本并使其迭代文件夹。
#!/bin/bash
for dir in ~/code/stack/Pictures/*; do
[ -d "${dir}" ] || continue
i=1
for img in "${dir}"/*.jpg; do
[ -e "${img}" ] || break
new="$(printf "%03d.jpg" "${i}")"
echo mv "${img}" "$(dirname "${img}")/${new}"
((i++))
done
done
首先使用回声更改“图片”文件夹和干燥运行的位置。这就是你想要的......?
答案 2 :(得分:0)
#!/bin/bash
function renameImages {
local i=1;
for oldFile in * ; do
if [ -d "$oldFile" ] ; then
pushd "$oldFile" >/dev/null
renameImages
popd >/dev/null
elif [ "${oldFile##*.}" == "jpg" ] ; then
newFile=$(printf img.%03d.jpg $i)
echo "$PWD/$oldFile -> $PWD/$newFile"
i=$((i+1))
fi
done
}
renameImages
这实际上不会重命名任何文件,而是会在屏幕上打印它的样式。
如果您对它的功能感到满意,请更改
echo "$PWD/$oldFile -> $PWD/$newFile"
到
mv "$PWD/$oldFile" "$PWD/$newFile"
注意:此答案的第一次编辑会重命名所有文件,不管是否为.jpg。此版本仅重命名.jpgs。
答案 3 :(得分:0)
#!/bin/bash
a=1
for i in $vm/Vacation/*; do
new=$(printf "%04d.jpg" ${a})
mv ${i} $vm/Vacation/${new}
let a=a+1
done
b=1
for i in $vm/Holiday/*; do
new=$(printf "%04d.jpg" ${b})
mv ${i} $vm/Holiday/${new}
let b=b+1
done
c=1
for i in $vm/Fun/*; do
new=$(printf "%04d.jpg" ${c})
mv ${i} $vm/Fun/${new}
let c=c+1
done
这是漫长而乏味的,并不理想,但它确实有效。使用多年的文件夹来排序和添加图片时,我会接受一个更短的解决方案。