У меня есть каталог с 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>&-
Спасибо за чтение.
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.