Linux-替换文件名中的空格

Linux-替换文件名中的空格,linux,replace,command,filenames,spaces,Linux,Replace,Command,Filenames,Spaces,我在一个文件夹中有许多文件,我想用下划线替换所有文件名中的每个空格字符。我怎样才能做到这一点呢?假设您的所有文件都是.txt文件,请尝试以下方法: for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done 如果使用bash: for file in *; do mv "$file" ${file// /_}; done 使用sh for i in *' '*; do mv "$i" `echo $i | sed

我在一个文件夹中有许多文件,我想用下划线替换所有文件名中的每个空格字符。我怎样才能做到这一点呢?

假设您的所有文件都是.txt文件,请尝试以下方法:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
如果使用bash:

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

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done
如果您想在触发前尝试此操作,只需将
mv
更改为
echo mv

即可:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
引用您的变量:

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

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

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

rename "s/ /_/g" *
您可以使用-n标志进行试运行:

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

如果要递归地应用替换任务,该怎么办?你会怎么做

我自己刚刚找到了答案。这不是最优雅的解决方案(也尝试重命名不符合条件的文件),但它可以工作。(顺便说一句,在我的例子中,我需要用“%20”重命名文件,而不是用下划线)


Linux
中,用另一个字符串替换字符串(本例中为空格字符)的最简单方法是使用
sed
。你可以这样做

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

希望这有帮助。

要重命名所有扩展名为
.py
的文件,请使用,

找到-iname“*.py”-类型f | xargs-I%重命名为“s//g/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

下面是另一个解决方案:

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

  • 在Python>=3.5的Linux中,这将在每个文件夹和文件名中递归地将
    '
    替换为
    '
    。使用路径将
    path\u更改为\u文件夹

    仅列出文件和文件夹:

    python -c "import glob;[print(x) for x in glob.glob('path_to_your_folder/**', recursive=True)]"
    
    将每个文件夹和文件名中的
    '
    替换为
    '

    python -c "import os;import glob;[os.rename(x,x.replace(' ','_')) for x in glob.glob('path_to_your_folder/**', recursive=True)]"
    
    使用Python<3.5,您可以安装



    获取以下错误tr:翻译mv:缺少文件参数时必须提供两个字符串请尝试“mv--help”以获取详细信息。Agin错误tr:参数太多请尝试
    tr--help”以获取详细信息。mv:缺少文件参数Try
    mv--help'了解更多信息。尝试时,我得到了mv:移动多个文件时,最后一个参数必须是目录Try
    mv--help'了解更多信息。mv:移动多个文件时,最后一个参数必须是目录Try
    mv--help'以获取详细信息。再次出现错误mv:缺少文件参数Try
    mv--help'以获取详细信息。mv:缺少文件参数请尝试
    mv--help'以了解更多信息。mv:缺少文件参数有关详细信息,请尝试
    mv--help'。mv:missing file argument Try
    mv--help”以获取更多信息。@Levisle85:Thx,不知道。如果使用perl样式重命名而不是更简单的redhat/fedora,则此操作将有效。fedora版本将在OSX中不可用。在macOS 10.12.3上,
    rename
    可用。@davidean在Arch Linux上的重命名只会替换第一次出现的名称(对于有多个空格的文件/目录不太方便)。它与fedora的语法相同,所以我怀疑它们可能是同一个。但是可以安装perl rename,它只是重复mv命令,而不是真正的重命名文件!删除echo会产生错误,如mv:cannot stat
    \'1130 lake micigan view.jpg\'':没有这样的文件或目录mv:cannot stat
    \'1130\u doomry\u floor\u plan.jpg\'':没有这样的文件或目录mv:cannot stat\'1130\u diningroom\u table.jpg\'':没有这样的文件或目录directoryLinux Linux 2.6.9-42.0.3.EL.wh1smp#1 SMP周五8月14日15:48:17 MDT 2009 i686 i686 i386 GNU/Linux这对我不起作用。它声称存在相同的文件(文件名错误)。例如,试图重命名
    1-foo.jpg
    ,而我的文件夹中已经有
    1.jpg
    。我发现反勾号接近引号时有点难以读取。对于*中的文件,相同但可读性更高的是
    ;do mv“$file”$(echo$file | tr'''''''''u');完成
    注意:这是从要更新其文件名的目录中运行的。或者,您可以将
    *
    更改为
    路径\u以\u您的\u目录
    。这并不能解决问题。这不适用于包含空格的子文件夹
    python -c "import os;import glob;[os.rename(x,x.replace(' ','_')) for x in glob.glob('path_to_your_folder/**', recursive=True)]"
    
    pip install glob2
    python -c "import os;import glob2;[os.rename(x,x.replace(' ','_')) for x in glob2.glob('path_to_your_folder/**')]"