Удалить определенные символы из нескольких файлов с пробелами

8

Я пытаюсь переименовать кучу музыкальных треков в каталоге, но я получил эту ошибку:

При перемещении нескольких файлов последний аргумент должен быть каталогом

Это скрипт:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

Это работает для файла без пробелов, как мне изменить этот скрипт?

Casper
источник

Ответы:

14

Используйте цитаты:

mv -- "$file" "$(echo "$file" | sed ...)"

Остальное mvвидит несколько аргументов. Имя файла file name with spacesбудет 4 аргумента для mv. Поэтому ошибка: when moving multiple files, last argument must be a directory. Когда mvимеет более 2 аргументов, предполагается, что вы хотите переместить несколько файлов в каталог (который будет последним аргументом).


Но, похоже, вы хотите удалить первые 5 символов из имени файла. Это можно сделать проще с bash:

mv -- "$file" "${file:5}"

Редактировать : я добавил --флаг, благодаря комментарию @ pabouk . Теперь файл, начинающийся с тире -, также корректно обрабатывается.

хаос
источник
2
Это может не работать с именами файлов, начинающимися с -. Вместо echo "$file"использования printf '%s\n' "$file".
Пабук
Я забыл о mv. :) Вы справились с этим делом :) --- Я имел в виду проблему с echoсамим собой. Например GNU эхо (как автономный и Баш встроенный) не будет печатать эти строки: -n, -eи -E. Даже в соответствии с определением POSIX невозможно echoнадежно использовать, потому что определенные ситуации не определены. XSI-совместимый echoбудет интерпретировать escape-последовательности обратной косой черты. --- printf '%s\n'не имеет таких нежелательных и зависящих от реализации эффектов.
Пабук
3

Вы можете использовать prename, который часто распространяется вместе с Perl. (Например, в Debian perlпакет / usr / bin / prename устанавливается пакетом.) Если он не упакован вашим дистрибутивом (ищите prenameи renameв обычных местах двоичных файлов), он доступен для загрузки из ряда мест, таких как например здесь , здесь или здесь .

Этот сценарий принимает регулярное выражение для применения к каждому из имен файлов и набора имен файлов и изменяет имена этих файлов в соответствии с этим регулярным выражением.

Например, вы можете сделать

prename -v -n 's/^.{5}//' *

чтобы показать, что произойдет, если вы удалите первые пять символов в именах файлов. Чтобы действительно выполнить переименование, вы просто удалите -n.

CVn
источник