![Bash 脚本:重命名目录下的所有文件?](https://linux22.com/image/1295065/Bash%20%E8%84%9A%E6%9C%AC%EF%BC%9A%E9%87%8D%E5%91%BD%E5%90%8D%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%EF%BC%9F.png)
以下是我想用伪代码做的事情:
for subdir in [all first-level subdirectories of the current directory]:
for file in [all files in subdir]:
rename file to "myprefix_" + current_filename_padded_with_zeroes
我的意思current_filename_padded_with_zeroes
是,例如,如果当前文件名01.png
更改为0001.png
,或者100.png
将其更改为0100.png
。
有人能帮我把上述内容翻译成 bash 脚本吗?
类似于...我不确定如何进行重命名部分:
#!/bin/bash
for DIR in $(ls)
do
for FILENAME in $(ls $DIR)
do
mv "$FILENAME" "myprefix_{%FILENAME}"
done
done
答案1
使用以下命令重命名当前目录中的所有文件:
for file in * ; do
mv "$file" "myprefix_$( printf "%04d" $file )"
done
该printf
程序与不少编程语言中的同名函数类似。
您需要使用basename
并dirname
从不同的目录使其工作。
答案2
用来printf
填充零,直到达到您想要的长度。%04d
意味着用零填充到 4 位数字的长度(如果您的数字> = 4 位数字,则不会改变任何内容)。匹配之前${a%.png}
的部分。一些和需要从路径中提取实际文件名并重新连接它。$a
.png
basename
dirname
您可以使用 替换循环find . -dept 2
。
find . -depth 2 -exec bash -c 'FILENAME=`basename {}`; mv {} `printf \`dirname {}\`/%04d.png ${FILENAME%.png}`' \;