我必须创建一个 bash shell 来重命名目录结构中的文件名。如果文件名包含\
或:
或空格,则应分别将其转换为_
、_
和-
。我尝试使用带有命令“for”和“find”的循环,但它不起作用。有什么建议吗?
答案1
使用 Perl 的rename
:
rename -n 'y/\\: /__\-/ if -f' *
... 其中-n
用于试运行(实际重命名文件、删除它或将其更改为-v
以获得详细程度),y
将把搜索列表中的每个字符\\:
(即转义的反斜杠\
、冒号:
和空格)转换为替换列表中的相应字符
__\-
(即下划线_
、另一个下划线_
和转义的连字符-
),并且if -f
仅适用于重命名过程中不包括目录的文件。
注意您可以扩展这两个列表,只要搜索列表中的每个字符在替换列表中都有其对应的字符,并且顺序正确,并且只要您在 RegEx 上下文中而不是在 shell 上下文中转义任何需要转义的字符,因为引号会保护这些字符免受 shell 的侵害。
注意.
除非您明确设置 Bash 的dotglob
选项,否则这对以点开头的隐藏文件不起作用。
答案2
创建脚本,例如translate.sh
:
#! /bin/bash
old=$1
new=${1//:/_} # Replace colons by underscores.
new=${new// /-} # Replace spaces by dashes.
new=${new//\\/_} # Replace backslashes by underscores.
if [[ $new = $old ]] ; then # No change, skip this one.
exit
fi
if [[ -e $new ]] ; then
echo "Cannot rename $old, $new already exists" >&2
else
mv "$old" "$new"
fi
然后运行
find . -exec ./translate.sh {} \;