我的 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 变量时使用引号;它们可能包含空格或为空,当不加引号时,它们通常会混淆传递给它们的命令(参数太多或丢失)。