2016-01-27 6 views
0

Я должен выполнить следующие действия на несколько файлов в одной папке:Удалить общий префикс из многих файлов сразу

Remove "Sword of the Stranger - " part from the file names like "Sword of the Stranger - Aganai No Yuki - ストレンヂア無皇刃譚 - [20-25].mp3".

Чтобы сделать это я построил следующую команду:

find . -name '*.mp3' -exec sh -c "cp {} `echo {} | cut -f2- -d'-' | cut -c2-`" \; 

Но при выполнении вышеуказанной команды я получаю следующую ошибку:

cp: target ‘}’ is not a directory 

Даже если я изменю приведенную выше команду для учета пробелов в именах файлов, он все равно дает мне ту же ошибку.

find . -name '*.mp3' -exec sh -c "cp {} "`echo {} | cut -f2- -d'-' | cut -c2-`"" \; 

Пожалуйста, кто-нибудь объяснить, почему я получаю сообщение об ошибке и предложить еще одну прокладку, чтобы сделать вышеописанную операцию (предпочтительно с использованием находку и Exec и ф).

ответ

1

Проблема в том, что двойные кавычки не препятствуют подстановке команд; то есть, что-то вроде этого:

echo "`echo foo`" 

печатает foo, а не `echo foo`.

Так что в вашем примере происходит замена команды доfind. То есть, это:

find . -name '*.mp3' -exec sh -c "cp {} `echo {} | cut -f2- -d'-' | cut -c2-`" \; 

эквивалентно следующему:

find . -name '*.mp3' -exec sh -c "cp {} }" \; 

, поскольку команда echo {} | cut -f2- -d'-' | cut -c2- печатает }.

Чтобы исправить это, вместо этого вы можете использовать одиночные кавычки.

Кроме того, вы должны будете использовать двойные кавычки, в нескольких местах в вашей команде, чтобы предотвратить ваши имена файлов были интерпретированы как множественные аргументы echo и cp:

find . -name '*.mp3' -exec sh -c 'cp "{}" "`echo "{}" | cut -f2- -d- | cut -c2-`"' \; 

(Обратите внимание, что Я также изменил -d'-' к -d-. Они эквивалентны в любом случае, так что нет никакой необходимости делать что-либо фантазию, чтобы получить -d'-' внутри одной кавычек.)

+0

Я использовал команду с одинарными кавычками, как вы упомянули. Также я помещаю '' part inside '"для учета пробелов в имени файла, и теперь я получаю новую ошибку:' cp: target' Sora No Hate Made - ス ト レ ン ヂ ア 無 皇 刃 譚 - [25-25] .mp3 'is not каталог – tom

+0

@tom: Обновлен для адресации пробелов в ваших файлах. (Вам нужно больше, чем только один набор '' ''.) – ruakh

+0

Да, я работал на этот раз, но вы можете объяснить мне, почему эта ошибка «не была»? – tom

Смежные вопросы