如何使用 Linux shell 重命名带有空格的文件?

如何使用 Linux shell 重命名带有空格的文件?

我命名了一些带有空格的文件,我想用 替换空格_。但是,每次我在 shell 中用文件名写入命令(例如Spring 2011)时,shell 都无法识别该文件或目录。

我该怎么办? 有没有办法使用 unicode 字符作为空格?

答案1

转义空格,例如Spring\ 2011,或使用引号,例如'Spring 2011'。将来,在任何 *NIX 上使用带有空格的文件名通常都是一个坏主意。

如果你有rename,你可以使用它:

rename ' ' '_' [filenames...]

答案2

如果你没有rename或者只想使用 shell:

for f in *\ *; do mv "$f" "${f// /_}"; done

细分如下:

  • *\ *选择名称中带有空格的所有文件作为循环的输入for。该模式*X*选择X名称中带有空格的所有文件,对于特殊字符空格,我们必须使用斜线对其进行转义,以便 bash 不会将其视为分隔不同参数。
  • 周围的引号"$f"很重要,因为我们知道文件名中有一个空格,否则它会显示为 2+ 个参数mv
  • ${f//str/new_str}是 bash 特有的字符串替换功能。 的所有实例都str将被替换为new_str

答案3

如果您的机器有改名命令,则会将当前工作目录中所有文件/目录中的所有空格更改为下划线:

rename 's/ /_/g' *

答案4

要以编程方式重命名 N 个文件,可以使用简单的bashfor 循环。

#!/bin/bash

set -eux

# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

如果文件名少于 5 个,则可以手动输入所有文件名,然后使用rename类似上述命令解决方案建议。但对我来说...我更喜欢程序化解决方案...即使只有 4 个文件。

附言

如果您不熟悉的Bash参数扩展(即${filename// /_}),您可以使用以下rename命令:

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi

相关内容