将 Linux 文件名更改为与 NTFS 兼容的文件名

将 Linux 文件名更改为与 NTFS 兼容的文件名

我必须创建一个 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 {} \;

相关内容