пакетное переименование zip-файлов на основе содержащихся имен файлов

У меня есть каталог с 15000 zip-файлами. Я хотел бы переименовать все файлы, которые, когда они разархивированы, содержат файл вида

YYYYMMDD_IPC.csv

, где YYYYMMDD является датой, но для целей этой проблемы любая строка содержит ровно 8 цифры. Затем сам zip-файл должен быть переименован в

YYYYMMDD_IPC.zip.

Я получил до следующей командной строки, но я не знаю, как захватить YYYYMMDD из содержащегося файла для использования в порядке чтобы переименовать zip-файлы:

find . -iname '*.zip' | while read file; do unzip -l "$file" | grep -q -P '\d{8}_IPC.csv' && echo $file; done 2>&- 

Спасибо за чтение.

2
задан 25 September 2015 в 21:41

1 ответ

find . -iname '*.zip' -exec bash -c 'name=$(unzip -qql "$1"  '*_IPC.csv' | grep -oE '[[:digit:]]{8}_IPC.csv' | head -n1); [ "$name" ] && mv "$1" "${name%csv}zip"' none {} ';'

, Как это работает

, Эта команда имеет форму:

find . -iname '*.zip' -exec bash -c '...' none {} ';'

Это ищет .zip файл в текущем каталоге и всех подкаталогах под ним. Поскольку каждый такой файл нашел, что команда удара в одинарных кавычках выполняется. Название найденного файла предоставляется в аргументе один, $1, к команде удара. В нашем случае команда удара имеет две части. Первые извлечения название файла CSV и сохраняют его в переменной удара name:

name=$(unzip -qql "$1"  '*_IPC.csv' | grep -oE '[[:digit:]]{8}_IPC.csv' | head -n1)

вышеупомянутое использование замена команды : команда в $(...) выполняется, и ее стандарт получен. В этом случае мы присваиваем его переменной name. Команда unzip -qql "$1" '*_IPC.csv' бесшумно извлекает все имена файлов из zip-файла, которые соответствуют шарику *_IPC.csv. Мы не должны ограничивать шариком *_IPC.csv, но, если zip-файл имеет много файлов в нем, это может ускорить вещи.

команда grep, rep -oE '[[:digit:]]{8}_IPC.csv' далее выбирает, только они называют тот запуск с 8 цифрами. Эти head -n1 управляют, выбирает первое такое найденное имя. Если бы было только одно такое имя, [то 1113] не был бы необходим. Но, хранение head могло ускорить вещи, потому что оно заставляет конвейер завершаться после первого соответствия.

вторые тесты части, что мы преуспели в том, чтобы получить непустое name и, если так, переименовывают zip-файл:

[ "$name" ] && mv "$1" "${name%csv}zip"

вышеупомянутое использование суффиксное удаление , чтобы изменить имя файла CSV на название zip-файла. ${name%csv} возвраты $name удалив суффикс csv. ${name%csv}zip добавляет суффикс zip.

4
ответ дан 26 September 2015 в 07:41
  • 1
    Я попробовал, но в некотором приложении, которые развертываются на сервере (SickRage примером), даты находятся все еще в формате en_GB – J4N 15 December 2016 в 10:38

Другие вопросы по тегам:

Похожие вопросы: