#bash #echo #space #glob #mv
#bash #echo #Космос #глобус #mv
Вопрос:
Я довольно новичок в bash, поэтому извините, если это своего рода базовый вопрос. Я пытался переименовать кучу файлов mp3, чтобы добавить 1-
к их именам файлов, и mv *.mp3 1-*.mp3
, к сожалению, не сработало. Итак, я попытался написать сценарий, сначала с помощью echo, чтобы протестировать команды:
for f in *.mp3 ; do echo mv '$f' '1-$f'; done
Который, похоже, выводит команды, которые мне нравятся, поэтому я удалил echo, изменив команду на
for f in *.mp3 ; do mv '$f' '1-$f'; done
Что не удалось. Затем я попытался передать команды следующим образом
for f in *.mp3 ; do echo mv '$f' '1-$f'; done | /bin/sh
Это сработало, но если бы кто-нибудь мог просветить меня относительно того, почему средняя команда не работает, мне было бы интересно узнать. Или, если есть более элегантный однострочник, который делал бы то, что я хотел, мне было бы интересно посмотреть и на это.
Ответ №1:
Я думаю, вам нужно изменить команду на
for f in *.mp3 ; do mv "$f" "1-$f"; done
В противном случае вы бы передали что-то вроде 'file1.mp3'
и '1-file1.mp3'
в mv
(включая одинарные кавычки).
Комментарии:
1. я намеревался включить одинарные кавычки, потому что в противном случае мне нужно было бы экранировать все пробелы обратной косой чертой. mv не возражает против кавычек. однако имена файлов также могут содержать ‘ в них (и «, если уж на то пошло).
2. Вам не нужно экранировать пробелы, когда вы используете двойные кавычки вокруг
$f
. Также не проблема, если имя файла содержит одинарные или двойные кавычки.
Ответ №2:
Пробный запуск:
rename -n 's/^/1-/' *.mp3
Удалите -n
, если для запуска команды это выглядит корректно. man rename
подробнее.
Комментарии:
1. Это работает на Debian, но не на CentOS, где команда rename не соответствует этому синтаксису и намного менее эффективна.