查找并重命名文件名包含空格的文件(包括目录)

查找并重命名文件名包含空格的文件(包括目录)

我的 ext4 文件系统中有很多文件名中带有空格的文件和目录。

我应该如何安全地找到并重命名它们?我有 bash 并且正在运行 Ubuntu。

是否可以交互地重命名每个找到的文件,即询问我是否要将每个文件的内容重命名为什么?

您将使用什么约定来选择文件名来重命名它们?

答案1

该脚本将查找目标目录中的所有文件,并生成一个新脚本,将所有文件重命名为不包含空格。然后,您可以在执行之前随意查看脚本:

#!/bin/bash
TARGET=/path/to/files
NEWSCRIPT=${HOME}/rename-spaced-files.sh

OLDIFS="${IFS}"
IFS="\n"
for file in $(find ${TARGET}/ -type f -name "* *"); do
    if [[ -f \"${file// /}\" ]]; then
        echo "# \"${file// /}\" already exists- come up with a new name for it and uncomment the next line" >> $NEWSCRIPT
        echo -n "# " >> $NEWSCRIPT
    fi
    echo "mv \"${file}\" \"${file// /}\"" >> $NEWSCRIPT

done

答案2

对于每个目录,使用重命名很简单:

rename 's/\s/_/g' *

这将删除目录中文件名中的所有空格并将其替换为“_”。如果省略“g”,它只会替换文件名中的第一个空格,因此不要忘记该部分。 * 表示运行它的目录中的所有文件。

rename 's/\s/_/g' /home/you/something/*

将替换目录中文件名中的所有空格:/home/you/something/

这不包括遍历许多目录,但这就是我通常的做法。

我喜欢下划线,这会改变:

my file with spaces.txt

my_file_with_spaces.txt

答案3

虽然文件名中包含空格在 Unix 及其文件系统中是完全合法的,但在与 shell 命令或变量(例如在脚本中)一起使用它们时,必须小心引用这些名称。否则,shell 会将每个单词作为单独的参数传递给命令。

VAR="existing file with spaces in name"

#This works
ls "${VAR}"

#This results in file(s) not found
ls ${VAR}

除了已经给出的答案之外,您还可以使用mmv命令重命名名称与模式匹配的多个文件,与名称中的空格无关,因为mmv无论如何您都必须引用源模式和目标模式。

而且还厚颜无耻引用我自己的话(双关语不是有意的,但欣然接受):

经验法则:总是在扩展包含字符串的 shell 变量时使用引号;它们可能包含空格或为空,当不加引号时,它们通常会混淆传递给它们的命令(参数太多或丢失)。

相关内容