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

Phi*_*aun 36 linux bash shell

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

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

Raf*_*ler 38

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

如果你有rename,你可以使用这个:

rename ' ' '_' [filenames...]
Run Code Online (Sandbox Code Playgroud)

  • 为什么这是一个坏主意?正确处理文件名是程序员的责任。 (3认同)
  • 这个答案似乎不起作用(至少在 Ubuntu 12.04 LTS 上)。_unutbu_ 的答案虽然很好用。 (3认同)

unu*_*tbu 35

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

rename 's/ /_/g' *
Run Code Online (Sandbox Code Playgroud)

  • 确认在 Ubuntu 12.04 中工作 (2认同)

bla*_*lah 30

如果您没有rename或更喜欢仅使用 shell:

for f in *\ *; do mv "$f" "${f// /_}"; done
Run Code Online (Sandbox Code Playgroud)

分解:

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

  • 这有效,但对我来说它只替换了第一个空格。如果我在 *\ * 中使用 `for f; do mv "$f" "${f// /_}"; 完成`它有效 (2认同)

小智 6

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