2009-11-27 149 views

回答

104

这应做到:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done 
+0

这不适合我。它声称存在相同的文件(使用错误的文件名)。例如。试图重命名'1 - foo.jpg',我的文件夹中已经有了'1.jpg'。 – byxor 2017-10-18 14:05:48

0

我相信你的回答是在Replace spaces in filenames with underscores

+1

虽然这可能在理论上回答这个问题,[这将是更可取的](http://meta.stackexchange.com/q/8259)在这里包括答案的基本部分并提供链接供参考。 – 2011-10-27 14:58:23

1

尝试是这样的,假设所有的文件都是.TXT的:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done 
+2

得到了以下错误 tr:翻译时必须给出两个字符 mv:缺少文件参数 尝试'mv --help'以获取更多信息。 – 2009-11-27 05:31:24

+2

Agin错误tr:参数太多 尝试'tr --help'获取更多信息。 mv:缺少文件参数 尝试使用'mv --help'以获取更多信息。 – 2009-11-27 07:06:15

3

如果您使用bash:

for file in *; do mv "$file" ${file// /_}; done 
+0

当我尝试时,我得到了 mv:当移动多个文件时,最后一个参数必须是目录 尝试'mv --help'以获取更多信息。 mv:当移动多个文件时,最后一个参数必须是一个目录 尝试'mv --help'以获取更多信息。 – 2009-11-27 05:32:12

+0

应该是'$ {FILE// _}' – soulmerge 2009-11-27 05:49:45

+0

只能替换1个空格 – ghostdog74 2009-11-27 05:56:02

7

使用SH ...

for i in *' '*; do mv "$i" `echo $i | sed -e 's/ /_/g'`; done 

如果您想在拉动扳机之前尝试一下,只需将mv更改为echo mv即可。

+0

这一个也工作得很好 – 2009-11-27 07:03:13

1

引用您的变量:

for file in *; do echo mv "'$file'" "${file// /_}"; done 

删除 “回声” 来完成实际的重命名。

+0

它正确地回应了mv命令,但并未真正重命名该文件! – 2009-11-27 07:05:16

+0

去除回声产生像 错误mv:不能stat'\'1130湖micigan view.jpg \'':没有这样的文件或目录 mv:can stat'\'1130_1_bedroom_floor_plan.jpg \'':没有这样的文件或目录 mv:can not stat'\'1130_BedPicture_8.jpg \'':没有这样的文件或目录 mv:can stat'\'1130_diningroom_table.jpg \'':没有这样的文件或目录 – 2009-11-27 07:08:33

+0

什么是您的操作系统? – ghostdog74 2009-11-27 07:26:44

40

我更喜欢使用命令“重命名”,这需要Perl的正则表达式的风格:

rename "s/ /_/g" * 

你可以做-n标志彩排:

rename -n "s/ /_/g" * 
+0

这将工作*如果*你有perl样式重命名而不是更简单的redhat/fedora一个 – 2009-11-27 05:56:38

+4

Fedora版本将被重命名为“_”*' – 2009-11-27 05:57:15

+3

'rename'在OSX中不可用。 – 2014-02-12 16:53:33

4

,如果你有什么想要递归地应用替换任务?你会怎么做?

嗯,我刚刚找到答案。没有最优雅的解决方案(试图重命名不符合条件的文件),但工作。 (顺便说一句,在我的情况,我需要的文件用“%20”重命名不以下划线)

#!/bin/bash 
find . -type d | while read N 
do 
    (
      cd "$N" 
      if test "$?" = "0" 
      then 
       for file in *; do mv "$file" ${file// /%20}; done 
      fi 
    ) 
done 
0

Linux与另一个字符串替换字符串(空格字符在您的情况),最简单的方法是使用sed。你可以做到这一点如下

sed -i 's/\s/_/g' * 

希望这会有所帮助。

-1

我试图运行此作为脚本https://hastebin.com/xemitireri.bash

#!/bin/bash 
# https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names 
find . -type d | while read N 
do 
    (
      cd "$N" 
      if test "$?" = "0" 
      then 
       for file in *; do mv "$file" ${file// /_}; done 
      fi 
    ) 
done 

我想在一个文件夹,里面有它的多个文件夹,每个中都有多个文件递归运行此。文件夹名称和文件名称中都有空格(例如,在包含“磁盘1”,“磁盘2”等“Good Album”的文件夹“Testing”上运行它。每个磁盘的文件夹都有“Song 1 .txt“,”Song 2.txt“,”Song 3.txt等)。此DID重命名文件夹,但不重命名文件夹内的文件。 我收到错误 bash:cd:./Disk 02:没有这样的文件或目录 bash:cd:./Disk 01:没有这样的文件或目录 bash:cd:。/ Disk 03:没有这样的文件或目录

+0

这不是一个答案,而是另一个问题。请考虑提出一个新问题。 – Fabien 2017-07-13 22:32:04