Linux-替换文件名中的空格


Answers:


172

应该这样做:

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

这对我不起作用。它声称存在相同的文件(文件名错误)。例如,尝试重命名,1 - foo.jpg而我的文件夹已经1.jpg在其中了。
byxor

3
我发现反引号在引号附近时有点难以阅读。相同但可读性更高的是for file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron '18

注意:这是从WITHIN目录中运行的,该目录要更新其文件名。或者,您可以更改*PATH_TO_YOUR_DIRECTORY
CFitz

73

我更喜欢使用命令“ rename”,它使用Perl风格的正则表达式:

rename "s/ /_/g" *

您可以使用-n标志进行试运行:

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

3
如果您使用的是perl样式的重命名,而不是简单的redhat / fedora,这将起作用
David Dean,2009年

9
浅顶软呢帽版本应该是rename " " "_" *
David Dean

4
rename它在OSX中不可用。
EtienneLow-Décarie2014年

在macOS 10.12.3 rename上可用。
宋卓

1
@DavidDean Arch Linux上的重命名只会替换第一次出现的名称(对于具有多个空格的文件/目录来说,这不太方便)。它与fedora的语法相同,因此我怀疑它们可能是相同的。但是可以安装perl-rename。
prosoitos

15

使用sh ...

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

如果您想在拉动扳机之前尝试一下,请更改mvecho mv


4

如果您使用bash:

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

当我尝试时,我得到了mv:移动多个文件时,最后一个参数必须是目录。请尝试mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help'了解更多信息。
Mithun Sreedharan

再次出现错误mv:缺少文件参数尝试使用mv --help' for more information. mv: missing file argument Try mv --help'了解更多信息。mv:缺少文件参数请尝试mv --help' for more information. mv: missing file argument Try mv --help'了解更多信息。
Mithun Sreedharan

@ levislevis85:Thx,不知道。
soulmerge

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

2

假设您的所有文件都是.txt文件,请尝试如下操作:

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

2
出现以下错误tr:翻译mv时必须给出两个字符串:缺少文件参数请尝试使用mv --help获取更多信息。
Mithun Sreedharan

2
再次出现错误tr:参数过多请尝试使用tr --help' for more information. mv: missing file argument Try mv --help'了解更多信息。
Mithun Sreedharan

2

这是另一种解决方案:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. 使用awk在文件名周围添加引号
  2. 使用sed用下划线代替空格;打印带有引号的原始名称(来自awk);然后是替代名称
  3. xargs一次占用两行,并将其传递给mv

1

引用您的变量:

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

删除“ echo”以进行实际的重命名。


它适当地回显了mv命令,但实际上并没有重命名文件!
Mithun Sreedharan

删除回声会产生类似mv的错误:无法统计\'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \'1130_1_bedroom_floor_plan.jpg \':没有这样的文件或目录mv:无法统计\'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \'1130_diningroom_table.jpg \':没有这样的文件或目录
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp#1 SMP Fri Aug 14 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

用中的另一个字符串替换字符串(您的情况下为空格)的最简单方法Linux是使用sed。您可以按照以下步骤进行操作

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

希望这可以帮助。


这没有解决问题。
阿米特


0

.py使用扩展名重命名所有文件, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

样品输出

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
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.