BASH-скрипт для * создания * имен файлов с пробелами из имен файлов с "% 20" - PullRequest
0 голосов
/ 24 марта 2012

Во-первых, я знаю, это звучит задом наперед.Это.Но я пытаюсь преобразовать (в командной строке BASH) набор сгенерированных сценариями имен файлов с миниатюрами, которые do содержат "% 20" в эквивалент без имен файлов.Если вам интересно, причина в том, что скрипт, который я использую, создал миниатюрные имена файлов из их текущих URL-адресов и добавил% 20 в процессе.Но теперь WordPress ищет файлы типа «This% 20Filename.jpg», и браузер, конечно, удаляет escape-символ и заменяет его пробелами.Вот почему в именах файлов не должно быть пробелов.

Но так как я застрял здесь, я бы хотел преобразовать существующие эскизы.Далее я опубликую вопрос для помощи в устранении проблемы в вышеупомянутом скрипте.То, что я сейчас ищу, - это быстрый скрипт, чтобы сделать что-то плохое и создать имена файлов с пробелами из имен файлов с "% 20".

Спасибо!

Ответы [ 5 ]

3 голосов
/ 24 марта 2012

Если вы только хотите заменить каждый литерал %20 одним пробелом:

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

(например, это переименует file%with%20two%20spaces в file%with two spaces). Возможно, вам также придется применить %25 -> % и другие подобные преобразования.

2 голосов
/ 24 марта 2012

лично, мне не нравятся имена файлов с пробелами - будьте осторожны, вам придется обращаться с ними особенно в будущих сценариях.В любом случае, вот скрипт, который будет делать то, что вы хотите достичь.

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

Поместите это в файл, добавьте разрешение на выполнение и запустите его из каталога, где у вас есть файл с% 20 в их именах.

2 голосов
/ 24 марта 2012

convmv может сделать это, сценарий не требуется.

$ ls
a%20b.txt
$ convmv --unescape *.txt --notest
mv "./a%20b.txt"    "./a b.txt"
Ready!
$ ls
a b.txt
0 голосов
/ 24 марта 2012

Не 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);
}
0 голосов
/ 24 марта 2012

Код:

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