У меня есть 365 файлов с именем
MOD11A1.A2010001.h24v06.006.2016025150444.hdf
MOD11A1.A2010002.h24v06.006.2016025151748.hdf
MOD11A1.A2010003.h24v06.006.2016025163706.hdf
, и я хочу переименовать эти файлы как:
modis1.hdf
modis2.hdf
modis3.hdf
Я использую команду mv
отдельно для каждого файла, чтобы переименовать их ,
Как мне достичь этого за один раз?
Поскольку вам важен только бит A2010...
, используйте rename
в каталоге с файлами:
rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
Пример:
$ rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
rename(> MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis1.hdf)
rename(> MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis2.hdf)
rename(> MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis3.hdf)
rename(> MOD11A1.A2010365.h24v06.006.2016025150444.hdf, modis365.hdf)
Запуск без -n
на самом деле переименовать файлы.
В следующем способе используется расширение параметра bash, но оно полагается на то, что ваши имена файлов соответствуют именно тому формату, который вы указали, и зависит от расположения используемой числовой строки. Это не обязательно самый надежный метод. Вы также должны быть в каталоге, содержащем файлы.
for f in MOD*.hdf; do
num="${f:13:3}"
mv "$f" modis"$((10#$num))".hdf
done
Или как однострочный:
for f in MOD*.hdf; do num="${f:13:3}"; mv "$f" modis"$((10#$num))".hdf ; done
Это переместит файлы так, как вы просили, означая, что MOD11A1.A2010001.h24v06.006.2016025150444.hdf
станет modis1.hdf
, MOD11A1.A2010002.h24v06.006.2016025151748.hdf
становится modis2.hdf
и т. д.
Вы можете использовать команду rename
следующим образом:
$ rename -n 's/MOD11A1\.A2010(...)\..*/modis$1.hdf/' MOD*.hdf
rename(MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis001.hdf)
rename(MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis002.hdf)
rename(MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis003.hdf)
После тестирования удалите -n
, чтобы фактически переименовать файлы.
s/old/new
заменяют old
на new
\.
буквальный .
...
три символа, которые могут быть чем-нибудь (some chars)
сохранить some chars
, чтобы ссылаться позже с $1
rename
, как ответ Муру делает. Иногда вы хотите использовать более явное выражение, чтобы различать файлы, над которыми вы работаете или не хотите действовать, или чтобы убедиться, что ваше регулярное выражение не будет всасывать слишком много символов. В решении этой проблемы обычно достаточно гибкости. Обратите внимание, что этот не дает именно того, о чем вы просили; он поддерживает фиксированную ширину чисел. Я сделал это, потому что это хорошая идея использовать числа с фиксированной шириной в именах файлов (в противном случае они будут отсортированы в замешательстве, например, с 10 до 2) (и , потому что я не понял, как используйте rename
для создания имен, которые вы на самом деле просили ... если я это сделаю, я обновлю свой ответ del> ответ муру сделает это ...).
Обратите внимание, что Perl rename
не включен в установку по умолчанию 17.10 , поэтому, если вы работаете с 17.10 (или для будущих читателей, возможно, более поздней версией), начните с запуска
sudo apt install rename
Приведенный ниже код выполняет следующие действия:
MOD
и заканчиваются .hdf
выполнить команду mv
для текущего файла в списке и изменить его имя на modis
, следуя по номеру из переменной, следуя .hdf
#!/bin/bash
idx=1
for file in MOD*.hdf
do
echo mv "$file" "modis$((idx++)).hdf"
done
Примечание: приведенный выше скрипт будет только echo
команду, которую он планирует выполнить, вам нужно удалить echo
из строки echo mv
, чтобы выполнить действие действие.
Пример вывода:
mv MOD11A1.A2010001.h24v06.006.2016025150444.hdf modis1.hdf
mv MOD11A1.A2010002.h24v06.006.2016025151748.hdf modis2.hdf
mv MOD11A1.A2010003.h24v06.006.2016025163706.hdf modis3.hdf