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

#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 не соответствует этому синтаксису и намного менее эффективна.