Переименование глоба в bash

Я новичок в bash, так что извините, если это основной вопрос. Я пытался переименовать кучу mp3-файлов, чтобы добавить 1- к их именам, и mv *.mp3 1-*.mp3, к сожалению, не сработало. Поэтому я попытался написать сценарий, сначала с эхом для проверки команд:

for f in *.mp3 ; do echo mv \'$f\' \'1-$f\'; done

Который, кажется, выводит команды, которые мне нравятся, поэтому я удалил эхо, изменив команду на

for f in *.mp3 ; do mv \'$f\' \'1-$f\'; done

Который провалился. Затем я попытался передать команды вперед так

for f in *.mp3 ; do echo mv \'$f\' \'1-$f\'; done | /bin/sh

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


person wim    schedule 04.05.2011    source источник


Ответы (2)


Я думаю, вам нужно изменить команду на

for f in *.mp3 ; do mv "$f" "1-$f"; done

В противном случае вы бы передали что-то вроде 'file1.mp3' и '1-file1.mp3' в mv (включая одинарные кавычки).

person bmk    schedule 04.05.2011
comment
я намеревался включить одинарные кавычки, потому что в противном случае мне пришлось бы экранировать все пробелы обратной косой чертой. mv не возражает против кавычек. однако в именах файлов также может быть ' (и в этом отношении). - person wim; 04.05.2011
comment
Вам не нужно избегать пробелов, когда вы используете двойные кавычки вокруг $f. Также не проблема, если имя файла содержит одинарные или двойные кавычки. - person bmk; 04.05.2011

Пробный прогон:

rename -n 's/^/1-/' *.mp3

Удалите -n, если это выглядит правильно для запуска команды. man rename для получения подробной информации.

person l0b0    schedule 04.05.2011
comment
Это работает в Debian, но не в CentOS, где команда переименования не следует этому синтаксису и гораздо менее эффективна. - person Jean Paul; 29.05.2017