linux - 编写bash脚本以在当前目录和子目录中顺序重命名文件
问题描述
如何修复此脚本,以便它使用用户输入 STRING 重命名当前目录中的所有文件以及子目录中的所有文件?
当前文件名可以是任何东西。我希望所有文件的最终结果都被称为 STRING_001.jpg STRING_002.jpg STRING_003.jpg 等...
如果文件仅在其各自目录中是连续的,或者文件编号是否延续到下一个目录,这对我来说并不重要。
这是我经过几个小时的研究后最终编写的代码:
#!/bin/bash
# Let user input a string to use in filenames
read -p "Enter filename: " STRING
# Variable for sequential filenames
n=0
files=(./*)
# Looks for files in current directory
if [ ${#files[@]} -gt 0 ];
then
for f in ./*; do
# Renames files with STRING and sequentially
printf -v num %03d "$((++i))"
mv "$f" "${STRING}_$num.jpg"
done
else
for d in *; do
( cd -- "$d" &&
for f in ./*; do
# Executes rename command in sub-directories
printf -v num %03d "$((++i))"
mv "$f" "${STRING}_$num.jpg"
done
)
done;
fi
解决方案
脚本:
#!/bin/bash
read -p "Enter filename: " STRING
find . -type f | cat -n - | while read num infile ; do
filename=$(basename "${infile}")
filesans="${filename%%.*}"
newname=$(printf '%s_%03d' "${STRING}" "${num}")
newfile="${infile/$filesans/$newname}"
echo "mv \"${infile}\" \"${newfile}\""
done
(这里,这个脚本被命名为62566825.sh
。不是最伟大的名字。)
设置目录:
mkdir dir1 dir2 dir3
touch dir1/file{1,2,3} dir2/file{4,5,6}.jpg dir3/file{7,8,9}.foo.gz
$ find . -type f
./62566825.sh
./dir1/file1
./dir1/file2
./dir1/file3
./dir2/file4.jpg
./dir2/file5.jpg
./dir2/file6.jpg
./dir3/file7.foo.gz
./dir3/file8.foo.gz
./dir3/file9.foo.gz
执行:
$ ./62566825.sh
Enter filename: QUUX
mv "./62566825.sh" "./QUUX_001.sh"
mv "./dir1/file1" "./dir1/QUUX_002"
mv "./dir1/file2" "./dir1/QUUX_003"
mv "./dir1/file3" "./dir1/QUUX_004"
mv "./dir2/file4.jpg" "./dir2/QUUX_005.jpg"
mv "./dir2/file5.jpg" "./dir2/QUUX_006.jpg"
mv "./dir2/file6.jpg" "./dir2/QUUX_007.jpg"
mv "./dir3/file7.foo.gz" "./dir3/QUUX_008.foo.gz"
mv "./dir3/file8.foo.gz" "./dir3/QUUX_009.foo.gz"
mv "./dir3/file9.foo.gz" "./dir3/QUUX_010.foo.gz"
(只需修复echo "mv
实际做某事。)
推荐阅读
- reactjs - 将回调函数作为道具传递给孩子
- javascript - 如何在点击时按顺序创建表格?
- flutter - 输入时删除了 Flutter Draggable TextFormField
- deployment - Azure 函数 ansible 角色擦除默认设置
- c# - 为什么我无法在我的自定义 JwtBearerHandler 中访问 HandleAuthenticateAsync 而不会产生异常?
- vue.js - Vue CLI 和 Yarn 工作区
- reactjs - 通过从头开始反应中两个经纬度之间的道路距离计算
- php - 为几种形式 Twig 声明一次 form_theme
- gun - 使用 SEA (gun.user()) 添加的 GUN 节点不安全?
- vue.js - VueJs 应用程序中的环境变量始终未定义