我有这样的目录结构:
AD
-> AD01
-> DSC123.jpg
-> DSC124.jpg
-> AD02
-> DSC234.jpg
-> DSC1455.jpg
-> AD03
->...
-> AD04
->...
->...
AE
->...
...
不,我想运行一个遍历整个树的脚本,并将每个文件夹文件重命名为连续的数字01.jpg,02.jpg ......等。
我找到了这样的东西来帮助连续数字:
find -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv %s %02d.jpg\n", $0, a++ }' | bash
但是如何让它在整个树中以递归方式运行所有文件夹(每个文件夹有1000个,每个文件夹大约有6-20个文件)。
编辑: 结果应如下所示:
AD
-> AD01
-> 01.jpg
-> 02.jpg
-> AD02
-> 01.jpg
-> 02.jpg
-> AD03
->...
-> AD04
->...
->...
AE
->...
...
答案 0 :(得分:1)
您可以尝试使用此bash
脚本
#!/bin/bash
for dir in $(find -type d \( ! -name '.*' \))
do
i=1;
for file in $(find "$dir" -name '*.png')
do
a=$(printf "%02d" $i)
new=${file%/*}
echo "mv $file $new/$a.png"
let i=i+1
done
done
它将列出要应用的mv
命令。看看它是否给出了你的期望。最后,将echo
替换为mv
命令。
答案 1 :(得分:1)
使用perl的最短的一个:
cd AD/AD02
rename -n 'no strict; s@.*(?=\.)@sprintf "%0.2d", ++$x@e' *.jpg
当输出看起来不错时,请移除-n
开关。
有些其他具有相同名称的工具可能无法执行此操作,因此请小心。
util-linux
软件包中的重命名命令不会。
如果运行以下命令(GNU
)
$ file "$(readlink -f "$(type -p rename)")"
并且您得到的结果包含Perl script, ASCII text executable
而不包含ELF
,那么这似乎是正确的工具=)
如果没有,则将其设置为Debian
和Ubuntu
之类的派生类的默认设置(通常已经是这样):
$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename
如果您没有此发行版的其他命令,请搜索软件包管理器以进行安装或do it manually(无部门...)
此工具最初由Perl的父亲Larry Wall编写。
答案 2 :(得分:0)
#!/bin/bash
files=$(find . -name "*.jpg" -type f)
a=1
for i in $files; do
dir=$(dirname "$i")
new=$(printf "%04d" ${a})
mv ${i} $dir/${new}.jpg
let a=a+1
done
答案 3 :(得分:0)
使用find查找目录,然后依次cd进每个目录并重命名文件。
find /path/to/catalogue -type d -exec bash -c '
shopt -s nullglob
for dir in "$@" ; do
( cd "$dir" || exit
files=( *[!0-9]*.jpg )
for (( n = 0 ; n < "${#files[@]}" ; n++ )) ; do
printf -v target '%02d.jpg' $(( n + 1 ))
mv -- "${files[$n]}" "$target"
done )
done
' bash {} +