Perl -pe для манипулирования именами файлов - PullRequest
2 голосов
/ 16 августа 2011

Я пытался выполнить быструю очистку имени файла в оболочке (zsh, если это имеет значение).Переименование файлов.(Я использую cp вместо mv просто для безопасности)

foreach f (\#*.ogg)
  cp $f `echo $f | perl -pe 's/\#\d+ (.+)$/"\1"/'`
end

Теперь я знаю, что есть инструменты для подобных вещей, но для личного интереса мне интересно, какможет сделать это таким образом.Прямо сейчас я получаю ошибку:

cp: target `When.ogg"' is not a directory

Где 'When.ogg' - последняя часть имени файла.Я попытался добавить кавычки (см. Выше) и избежать пробелов, но тем не менее это то, что я получаю.

Есть ли причина, по которой я не могу использовать вывод s perl pmr =; omrt в качестве окончательногоаргумент другого инструмента командной строки?

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Похоже, у вас есть пробел в именах файлов, которые обрабатываются, поэтому каждая из ваших командных строк cp оценивается примерно как

cp \#nnnn When.Ogg When.ogg

Когда команда cp видит более двух аргументов, последнийдолжно быть именем целевого каталога для всех копируемых файлов - отсюда и сообщение об ошибке.Поскольку ваше исходное имя файла ($f) содержит пробел, оно обрабатывается как два аргумента - cp видит три аргументов, а не два, которые вы намереваетесь. first $ f, который должен предотвращать обработку двух «половин» имени как отдельных имен файлов:

cp "$f" `echo ...
0 голосов
/ 16 августа 2011

Я часто пользуюсь

dir /b ... | perl -nle"$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n"

-l чипирует вход.

Проверка -e позволяет избежать случайного переименования всех файлов в одно имя. Я делал это пару раз.

В bash (и я предполагаю, что zsh) это будет

foreach f (...)
   echo "$f" | perl -nle'$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n'
end

или

find -name '...'  -maxdepth 1 \
   | perl -nle'$o=$_; s/.../.../; $n=$_; rename $o,$n if !-e $n'

или

find -name '...'  -maxdepth 1 -exec \
   perl -e'for (@ARGV) {
      $o=$_; s/.../.../; $n=$_;
      rename $o,$n if !-e $n;
   }' {} +

Последний поддерживает имена файлов с символами новой строки в них.

0 голосов
/ 16 августа 2011

Это то, что вам нужно в bash, надеюсь, что это хорошо и для zsh.

cp "$f" "`echo $f | perl -pe 's/\#\d+ (.+)$/\1/'`"

Если имя файла содержит пробелы, вы также должны заключить в кавычки второй аргумент cp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...