如何解决重命名许多文件夹中的文件
我有将近 1000000
个不同名称的文件夹,每个文件夹包含 5
个文件如下。我想将 5
个文件重命名为不同的名称
目录下的文件如下:
python.ps
bash.txt
ruby.txt
clang.ps
orange.txt
python.ps -- python3.ps
bash.txt -- bash2020.txt
ruby.txt --ruby19.txt
clang.ps -- clang90.ps
orange.txt -- orange20.txt
我正在 linux 中尝试 rename
命令,但它不起作用。所以我需要一个支持 shell 的脚本。希望有专家能帮助我。谢谢。
#!/bin/sh
for file in /home/un/data/folders/*
do
rename $file
done
解决方法
在目录结构中找到其中一个文件,然后在每个目录中执行多个mv命令,通过-execdir重命名文件。
find . -name "python.ps" -execdir mv python.ps python3.ps \; -execdir mv bash.txt bash2020.txt \; -execdir mv ruby.txt ruby19.txt \; -execdir mv clang.ps clang90.ps \; -execdir mv orange.txt orange20.txt \;
,
您可以通过关联数组使用此 bash
脚本:
#!/bin/bash
declare -A fmap=([range.txt]="range20.txt" \
[python.ps]="python3.ps" \
[bash.txt]="bash2020.txt" \
[ruby.txt]="ruby19.txt" \
[clang.ps]="clang90.ps" \
)
while IFS= read -rd '' file; do
fn="${file##*/}"
[[ -n ${fmap[$fn]} ]] && mv "$file" "${file%/*}/${fmap[$fn]}"
done < <(find /home/un/data/folders -type f -print0)
,
我建议使用带有 find
选项的 -exec
的替代解决方案。
在这里,我们将一个 shell 脚本作为字符串 (sh -c
) 传递给每个找到的文件执行。
这种方法在可读性和非常容易概括的能力之间提供了一个公平的平衡。例如,如果您想替换文件名中的字符,请更改文件名中的字符大小写,或者增加、减少或以其他方式更改原始文件名中的数字;以及目标文件名未固定的许多其他情况。
rename='
basename=$(basename "{}")
dirname=$(dirname "{}")
case "$basename" in
python.ps)
dest=python3.ps ;;
bash.txt)
dest=bash2020.txt ;;
ruby.txt)
dest=ruby19.txt ;;
clang.ps)
dest=clang90.ps ;;
orange.txt)
dest=orange20.txt ;;
*)
exit 0 ;;
esac
mv "{}" "$dirname/$dest"
'
find /home/un/data/folders/ -type f -exec sh -c "$rename" \;
注意:在 bash 中,您还可以执行以下操作,它允许您将重命名逻辑放在 函数 中,然后将其导出,以便 find
可以调用它。 但是注意POSIX不支持导出函数!因此,不要将此作为通用解决方案。
rename_files() {
basename=$(basename "$1")
dirname=$(dirname "$1")
case "$basename" in
python.ps)
dest=python3.ps ;;
bash.txt)
dest=bash2020.txt ;;
ruby.txt)
dest=ruby19.txt ;;
clang.ps)
dest=clang90.ps ;;
orange.txt)
dest=orange20.txt ;;
*)
exit 0 ;;
esac
mv "$1" "$dirname/$dest"
}
export -f rename_files
find /home/un/data/folders/ -type f -exec bash -c "rename_files '{}'" \;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。