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


28

我命名了多个文件,其中包含空格,并且我想用替换空格_。但是,每次我在shell中用文件名(例如Spring 2011)编写命令时,shell都无法识别文件或目录。

我该怎么办?有什么方法可以将Unicode字符用于空格吗?


要以编程方式重命名N个文件,请使用bashfor循环:在此处查看我的解决方案
Trevor Boyd Smith,

Answers:


33

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

如果您有rename,可以使用以下方法:

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

1
您是否知道可以一次对所有文件执行此操作?

3
为什么这是个坏主意?正确处理文件名是程序员的责任。
glenn jackman 2011年

1
@rafe,确实,如果不正确地处理文件名,很容易出错。当您只是忘记引用包含文件名的变量而不得不调试脚本时,会付出额外的努力。
格伦·杰克曼2011年

3
这个答案似乎不起作用(至少在Ubuntu 12.04 LTS上)。来自unutbu的答案虽然很好。
DNA

1
这只是对我来说是第一个空格...这对我没有帮助(我有rename2.23版)
Trevor Boyd Smith,

30

如果您的计算机具有重命名命令,那么这会将当前工作目录中所有文件/目录中的所有空格更改为下划线:

rename 's/ /_/g' *

确认可在Ubuntu 12.04
anthonygore中运行,2014年

1
不适用于我...我收到“重命名:参数不足”的错误。我有版本rename --version rename from util-linux 2.23.2
Trevor Boyd Smith,

24

如果您没有rename或不喜欢仅使用外壳程序:

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

细分:

  • *\ *选择名称中带有空格的所有文件作为for循环的输入。
  • 周围的引号"$f"很重要,因为我们知道文件名中有空格,否则它将显示为的2个以上参数mv
  • ${f//str/new_str}是bash特定的字符串替换功能。的所有实例str均替换为new_str

2
这有效,但对我来说,它仅代替第一个空格。如果我使用for f in *\ *; do mv "$f" "${f// /_}"; done它可以正常工作
billynoah 2014年

@billynoah好收获,已更新。
blahdiblah 2014年

@blahdiblah非常感谢!你救了我这么多时间!
游击队

@blahdiblah您的解决方案比我的解决方案更优雅。做得好。我不认为for循环glob会起作用...所以我在for循环之外进行了glob。
Trevor Boyd Smith,

3

mv "Spring 2011.file" Spring_2011.file 应该告诉命令行将带引号的字符串作为单个输入。


这是我上班的唯一答案。
blakeoft

1

要以编程方式重命名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个文件也是如此。

ps

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

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.