У меня есть 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)
Запустите без [ f5], чтобы фактически переименовать файлы.
Поскольку вы только заботитесь о бит 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, чтобы фактически переименовать файлы.
Поскольку вы только заботитесь о бит 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
Это приведет к перемещению файлов так, как вы (f3), 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, чтобы фактически переименовать файлы.
Обратите внимание, что это не дает вам именно то, что вы просили; он поддерживает фиксированную ширину чисел. Я сделал это, потому что это хорошая идея использовать номера фиксированной ширины в именах файлов (в противном случае они будут отсортированы в запутанном виде, например, с 10 до 2) (и потому, что я не понял, как использовать rename, чтобы создать имена, которые вы действительно просили ... если я это сделаю, я обновлю ответ, ответ на вопрос муру ...).
Обратите внимание, что ответ muru , поэтому если вы используете 17.10 (или для будущих читателей, возможно, более позднюю версию), начните с запуска
sudo apt install rename
Ниже приведен код:
для всех файлов, которые начинаются с MOD и заканчиваются на .hdf. Назначьте переменную, которая увеличит ее значение в 1 для каждого файла. 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
] Я создал следующий код. Я надеюсь, что читатель знаком с регулярным выражением в команде grep.
#!/bin/bash
declare -i Num
ls | grep '.*MOD11A1.A201.*hdf' | while read fName
do
step1=${fName##*MOD11A1.A201}
Num=${step1%%.*}
mv ${fName} modis${Num}.hdf
done
Я создал следующий код. Я надеюсь, что читатель знаком с регулярным выражением в команде grep.
#!/bin/bash
declare -i Num
ls | grep '.*MOD11A1.A201.*hdf' | while read fName
do
step1=${fName##*MOD11A1.A201}
Num=${step1%%.*}
mv ${fName} modis${Num}.hdf
done
Ниже приведен код:
для всех файлов, которые начинаются с MOD и заканчиваются на .hdf. Назначьте переменную, которая увеличит ее значение в 1 для каждого файла. 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
] Вы можете использовать команду 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, чтобы фактически переименовать файлы.
Обратите внимание, что это не дает вам именно то, что вы просили; он поддерживает фиксированную ширину чисел. Я сделал это, потому что это хорошая идея использовать номера фиксированной ширины в именах файлов (в противном случае они будут отсортированы в запутанном виде, например, с 10 до 2) (и потому, что я не понял, как использовать rename, чтобы создать имена, которые вы действительно просили ... если я это сделаю, я обновлю ответ, ответ на вопрос муру ...).
Обратите внимание, что ответ muru , поэтому если вы используете 17.10 (или для будущих читателей, возможно, более позднюю версию), начните с запуска
sudo apt install rename
Следующий способ использует расширение параметра 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
Это приведет к перемещению файлов так, как вы (f3), MOD11A1.A2010002.h24v06.006.2016025151748.hdf становится modis2.hdf и т. д.
Ниже приведен код:
для всех файлов, которые начинаются с MOD и заканчиваются на .hdf. Назначьте переменную, которая увеличит ее значение в 1 для каждого файла. 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
] Вы можете использовать команду 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, чтобы фактически переименовать файлы.
Обратите внимание, что это не дает вам именно то, что вы просили; он поддерживает фиксированную ширину чисел. Я сделал это, потому что это хорошая идея использовать номера фиксированной ширины в именах файлов (в противном случае они будут отсортированы в запутанном виде, например, с 10 до 2) (и потому, что я не понял, как использовать rename, чтобы создать имена, которые вы действительно просили ... если я это сделаю, я обновлю ответ, ответ на вопрос муру ...).
Обратите внимание, что ответ muru , поэтому если вы используете 17.10 (или для будущих читателей, возможно, более позднюю версию), начните с запуска
sudo apt install rename