【问题标题】:Linux - Replacing spaces in the file namesLinux - 替换文件名中的空格
【发布时间】:2010-12-20 21:10:35
【问题描述】:

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

【问题讨论】:

    标签: linux replace command filenames spaces


    【解决方案1】:

    应该这样做:

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

    【讨论】:

    • 这对我不起作用。它声称存在相同的文件(文件名错误)。例如。试图重命名1 - foo.jpg,而我的文件夹中已经有1.jpg
    • 我发现反引号在引号附近时有点难以阅读。相同但更具可读性的是for file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
    • 注意:这是从您要更新其文件名的目录中运行的。或者,您可以将* 更改为PATH_TO_YOUR_DIRECTORY
    【解决方案2】:

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

    rename "s/ /_/g" *
    

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

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

    【讨论】:

    • 这将起作用 如果你有 perl 风格的重命名,而不是更简单的 redhat/fedora one
    • fedora 版本是rename " " "_" *
    • rename 在 OSX 中不可用。
    • 在 macOS 10.12.3 上,rename 可用。
    • @DavidDean Arch Linux 上的重命名只会替换第一次出现(对于有多个空格的文件/目录不太方便)。它与 fedora 的语法相同,所以我怀疑它们可能是相同的。但是 perl-rename 可以安装。
    【解决方案3】:

    使用 sh...

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

    如果您想在扣动扳机之前尝试一下,只需将 mv 更改为 echo 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' 以获取更多信息。
      • 再次出现错误 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' 了解更多信息。
      • @levislevis85:谢谢,不知道。
      【解决方案5】:

      如果您想递归地应用替换任务怎么办?你会怎么做?

      嗯,我自己找到了答案。不是最优雅的解决方案,(也尝试重命名不符合条件的文件)但它有效。 (顺便说一句,在我的情况下,我需要用 '%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
      

      【讨论】:

        【解决方案6】:

        这是另一个解决方案:

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 得到以下错误 tr:翻译 mv 时必须给出两个字符串:缺少文件参数 尝试使用 `mv --help' 获取更多信息。
          • Agin error tr: too many arguments 请尝试tr --help' for more information. mv: missing file argument Try mv --help' 了解更多信息。
          【解决方案8】:

          引用你的变量:

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

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

          【讨论】:

          • 它正确地回显了 mv 命令,但并没有真正重命名文件!
          • 删除回显会产生类似 mv: cannot stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \'1130_1_bedroom_floor_plan.jpg\'': No such file or directory mv: cannot stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \'1130_diningroom_table.jpg\'' 的错误:没有这样的文件或目录
          • 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
          【解决方案9】:

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

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

          希望这会有所帮助。

          【讨论】:

          • 这并没有解决问题。
          【解决方案10】:

          要重命名所有带有.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
          

          【讨论】:

            【解决方案11】:

            这将在使用 Python >= 3.5 的 Linux 中递归地将每个文件夹和文件名中的 ' ' 替换为 '_'。用你的路径更改path_to_your_folder

            仅列出文件和文件夹:

            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 glob2

            pip install glob2
            python -c "import os;import glob2;[os.rename(x,x.replace(' ','_')) for x in glob2.glob('path_to_your_folder/**')]"
            

            【讨论】:

            • 这不适用于其中有空格的子文件夹
            猜你喜欢
            • 1970-01-01
            • 2010-11-19
            • 2011-08-27
            • 2021-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-17
            • 1970-01-01
            相关资源
            最近更新 更多