【问题标题】: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 的文件所在的目录运行它。
【解决方案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);
}