5

У меня есть несколько файлов, как это:

database1-backup-01-01-2011.sql
database2-backup-01-01-2011.sql

...так далее. Я хочу переименовать их, чтобы добавить AM, как это:

database1-backup-01-01-2011-AM.sql
database2-backup-01-01-2011-AM.sql

Какой самый краткий способ сделать это из оболочки bash?

4 ответа4

13

Другой вариант:

for i in *.sql ; do
    mv -v $i ${i%.sql}-AM.sql
done

Это перебирает все файлы .sql и переименовывает их в конец -AM.sql.

ПОДСКАЗКА: используйте $(command) вместо `command` в ваших сценариях (и в командной строке), это делает цитирование и экранирование менее кошмарным.

7

Попробуйте этот маленький скрипт:

#!/bin/sh

FILES=`ls *.sql`
for FILE in ${FILES}
{
    BASE=`basename ${FILE} .sql`
    mv ${FILE} ${BASE}-AM.sql
}

Я просто набрал это из памяти, так что, если он не работает 100%, не вините меня (то есть, сначала сделайте резервную копию ваших данных;))

Как это устроено:

Соберите все файлы в переменную (вместо этого вы можете поместить это в for, но мне нравится, чтобы все было легко читать):

FILES=`ls *.sql`

Перебрать каждый файл:

for FILE in ${FILES} { ... }

Получить имя файла без .sql:

BASE=`basename ${FILE} .sql`

Переименуйте файл, добавив -AM.sql к базовому имени:

mv ${FILE} ${BASE}-AM.sql
4

Используя версию сценария Perl rename:

rename 's/\.sql$/-AM$&/' *.sql

Используя версию util-linux-ng rename (но только если «.sql» появляется только в конце имени файла):

rename .sql -AM.sql *.sql

Используя mmv:

mmv '*.sql' '#1-AM.sql'
1

Поскольку был предложен скрипт Perl, вот скрипт Ruby, который делает то же самое:

`ls *.sql`.split("\n").each do |filename|
  new_filename = filename.split('.').join('-AM.')
  `mv #{filename} #{new_filename}`
end

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .