BASH脚本*创建*文件名,文件名为“%20”

时间:2012-03-24 05:57:43

标签: regex bash filenames spaces

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

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

谢谢!

5 个答案:

答案 0 :(得分:3)

如果想要用一个空格替换每个文字%20

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

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

答案 1 :(得分:2)

convmv可以执行此操作,无需脚本。

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

答案 2 :(得分:2)

个人而言,我不喜欢带空格的文件名 - 请注意,您将不得不在将来的脚本中特别对待它们。无论如何,这里的脚本将完成您想要实现的目标。

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

将其放入文件,添加执行权限并从名称中包含%20文件的目录中运行此权限。

答案 3 :(得分:0)

代码:

#!/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

答案 4 :(得分:0)

不是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);
}