【问题标题】:BASH script to *create* filenames with spaces from filenames with "%20"BASH 脚本 *create* 带有空格的文件名来自带有“%20”的文件名
【发布时间】:2012-04-08 14:56:56
【问题描述】:

首先,我知道这听起来很糟糕。它是。但我正在寻找(在 BASH 命令行上)将一堆 确实 包含“%20”的脚本生成的缩略图文件名转换为没有文件名的等价物。如果您好奇,原因是我使用的脚本从它们当前的 URL 创建了缩略图文件名,并在此过程中添加了 %20。但是现在 WordPress 正在寻找像“This%20Filename.jpg”这样的文件,而浏览器当然会删除转义字符并用空格替换它。这就是为什么文件名中不应该有空格的原因。

但由于我被困在这里,我很想转换我现有的缩略图。接下来,我将发布一个问题以帮助解决上述脚本中的问题。我现在正在寻找的是一个快速的脚本来做坏事,并用“%20”的文件名创建带有空格的文件名。

谢谢!

【问题讨论】:

    标签: regex bash filenames spaces


    【解决方案1】:

    convmv 可以做到这一点,不需要脚本。

    $ ls
    a%20b.txt
    $ convmv --unescape *.txt --notest
    mv "./a%20b.txt"    "./a b.txt"
    Ready!
    $ ls
    a b.txt
    

    【讨论】:

      【解决方案2】:

      代码:

      #!/bin/bash
      
      # This is where your files currently are
      DPATH="/home/you/foo/*.txt"
      
      # This is where your new files will be created
      BPATH="/home/you/new_foo" 
      
      TFILE="/tmp/out.tmp.$$"
      [ ! -d $BPATH ] && mkdir -p $BPATH || :
      for f in $DPATH
      do
        if [ -f $f -a -r $f ]; then
          /bin/cp -f $f $BPATH
         sed "s/%20/ /g" "$f" > $TFILE && mv $TFILE "$f"
        else
         echo "Error: Cannot read $f"
        fi
      done
      /bin/rm $TFILE
      

      【讨论】:

        【解决方案3】:

        如果您想将每个文字 %20 替换为一个空格:

        for i in *; do
            mv "$i" "${i//\%20/ }"
        done
        

        (例如,这会将file%with%20two%20spaces 重命名为file%with two spaces)。 不过,您可能还需要应用 %25->% 以及其他类似的转换。

        【讨论】:

          【解决方案4】:

          就我个人而言,我不喜欢带有空格的文件名 - 请注意,您必须在以后的脚本中特别对待它们。不管怎样,这里的脚本可以完成你想要实现的目标。

          #!/bin/sh
          for fname in `ls *%20*`
          do
            newfname=`echo $fname | sed 's/%20/ /g'`
            mv $fname "$newfname"
          done;
          

          将它放到一个文件中,添加执行权限,然后从你有文件名中包含 %20 的文件所在的目录运行它。

          【讨论】:

          • 这很好用。谢谢你,请知道我同意你的观点。我也不喜欢有空格的文件名。事实上,也许你可以帮助我尝试一个永久的解决方案,在这里:stackoverflow.com/questions/9849614/…
          【解决方案5】:

          不是 bash,而是名称中 %hh(编码的十六进制)的更一般情况。

          #!/usr/bin/perl
          foreach $c(@ARGV){
              $d=$c;
              $d=~s/%([a-fA-F0-9][a-fA-F0-9])/my $a=pack('C',hex($1));$a="\\$a"/eg;
              print `mv $c $d` if ($c ne $d);
          }
          

          【讨论】:

            猜你喜欢
            • 2011-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-07
            • 2011-04-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多