Например, я хочу mv (.*?).sql $1.php
,
Есть ли команда, которая позволяет мне указать шаблоны переименования?
Например, я хочу mv (.*?).sql $1.php
,
Есть ли команда, которая позволяет мне указать шаблоны переименования?
Как уже упоминали другие, rename
хорошо в этом, но прочитайте man-страницу (man rename
), прежде чем попробовать. Существует по крайней мере два совершенно разных инструмента, называемых rename
и какой у вас будет зависеть от вашего дистрибутива. Называть их неправильно может быть опасно.
Вот справочная страница для версии на основе Perl Ларри Уолла, которая поставляется с Ubuntu. Вы даете ему выражение perl, например, rename 's/\.sql$/.php/' *.sql
Вот справочная страница для переименования, которая поставляется со старыми дистрибутивами Red Hat и CentOS. Использование - это простая подстановка строк, например, rename .sql .php *.sql
Вы также можете использовать bash one-liner для обработки каждого файла по одному:
$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done
G'day,
Вы также можете попробовать войти
for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done
Или, чтобы заставить это использовать регулярное выражение, измените это немного, чтобы
for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done
для немного веселья кодирования оболочки. (-:
Будучи водопроводчиком, я люблю трубы :)
Примечание: этот ответ многословен - как новичок я ценю, когда кто-то, кто знает, находит время, чтобы объяснить, поэтому я плачу «вперед». Если вы не новичок, прошу прощения за длину и многословие.
ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash
Куда:
ls -1 *_201[67][0-9]*
перечисляет все файлы, соответствующие шаблону, в этом случае я ищу файлы с датой в имени файла в форме «ГГГГММДД»
sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
# : | | | | | | | |: :
# : |^2....^ ^3..................^^4.......^ |: :
# :^1..............................................................^: :
# /................filename.................pattern................./...mkdir...and....mv...command.../
^ 1: 1-я группа захвата - все имя файла
^ 2: 2-я группа захвата - 1-я часть шаблона имени файла
^ 3: 3-я группа захвата - вторая часть имени файла - здесь, дата в формате «ГГГГММДД»
^ 4: 4-я группа захвата - необязательная часть имени файла между датой и расширением и само расширение
Оооочень .... если у меня есть файл с именем
CallLog_555123412_20161231-214403.7z
...затем
mkdir -p \2\/\3; mv \1 \2\/\3\/\1
на самом деле означает
# make directory and sub-directory
mkdir -p CallLog_555123412/20161231
# move file from current directory to sub-sub-directory just created
mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z
Обратите внимание, что вывод команды sed передается в 'bash' для ее выполнения. Чтобы сначала увидеть предлагаемые перемещения файлов БЕЗ их фактического перемещения, сначала удалите '| bash 'в конце, и попробуйте так:
ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
Это не будет вносить никаких изменений, но вы увидите команду, которая будет выполнена, если вы запустите ее с помощью '| bash 'помечен на конце.
Это полезно, потому что вы можете создавать любые подкаталоги, которые вы хотите, из частей в имени файла, или что-либо еще, что вы добавляете к тексту «замены» в команде sed. Обратите внимание, что sed требует много экранирующих символов.
SED Regex скобки:
(...) требуется экранирование для группировки захвата -> \(...\)
{m, n} требует экранирования для количественной оценки предыдущего объекта -> \{m, n \}
/ требует экранирования в строке замены -> \/
[...] НЕ требует экранирования для классов персонажей
\1 в строке замены относится к 1-й захваченной группе и так далее ...
ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ: НИКОГДА НЕ ТРУПИТЕ НИЧЕГО, ЧТОБЫ «БЫТЬ», ЕСЛИ ВЫ ПОЛНОСТЬЮ НЕ ПОНИМАЕТЕ ИТОГО ...
Надеюсь, что это поможет устранить некоторые блокировки :)
Установите mmv
, затем сделайте это:
mmv "*.sql" "#1.php"