我有这样的目录结构:
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
->...
...
您可以尝试此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
命令。
使用查找找到目录,然后依次进入每个目录并重命名文件。
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 {} +
使用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编写。
#!/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