Рабочие заметки администрирования. Накопилось более 9000 изображений в каталоге и стали его тормозить. Была поставлена задача автоматизировать следующие операции: 1) создать каталоги с именами диапазона годов, за которые есть файлы.2) раскидать файлы по папкам в соответствии с их датой. Походу дела решались сопутствующие вопросы
Групповое создание каталогов
Три способа создать сразу несколько каталогов: перечислением, циклом, диапазоном: mkdir ./{2010,2011,2012,2013} mkdir ./$(for x in {2010..2013};do echo $x;done) mkdir ./{2010..2013} Таким образом видно, что если числовые каталоги являются диапазоном, то
и создавать их следует им же. В противном случае списком, а цикл вообще
от лукавого, хотя при необходимости позволит добавлять к цифрам буквенный префикс.
Поиск файлов по дате
Вывести (в текущей папке) файлы между двумя полными датами: find . -mindepth 1 -newermt '2011-03-29 00:00' ! -newermt '2011-03-30 23:59' -print
Вывести файлы от указанной даты до текущей:
find . -mindepth 1 -newermt '2020-01-01' ! -newermt $(date +%Y-%m-%d) -print Вывести файлы за весь указанный год:
y=2020; find . -mindepth 1 -newermt $y+'-01-01 00:00' ! -newermt $y+'-12-31 23:59' -print
Вывести файлы за весь указанный год в отсортированном виде:
y=2020; find . -mindepth 1 -newermt $y+'-01-01 00:00' ! -newermt $y+'-12-31 23:59' -print \ | sort -hr
Подсчитать кол-во файлов за весь указанный год: y=2016; find . -maxdepth 1 -newermt $y+'-01-01 00:00' ! -newermt $y+'-12-31 23:59' -print \ | wc -l
Подсчитать количество файлов в текущем каталоге: ls -A | wc -l
Подсчитать количество файлов рекурсивно (в текущем каталоге и всех его подкаталогах):
Отдельно создать папки с годами, и отдельно скопировать в них файлы по годам: mkdir ./{2011..2020} for y in {2011..2020}; do find . -maxdepth 1 -newermt $y+'-01-01 00:00' ! \ -newermt $y+'-12-31 23:59' -exec cp -p {} $y \; ; done
Проверка условия если нет папки 2010, то..
if ! [ -d ./2010 ]; then echo no ; else echo yes ; fi
Одной строкой создать каталоги по годам и скопировать в них файлы:
for y in {2011..2020}; do if ! [ -d ./$y ] ; then mkdir $y ; fi ; \ find . -maxdepth 1 -newermt $y+'-01-01 00:00' ! -newermt $y+'-12-31 23:59' \ -exec cp -p {} $y \; ; done
У команды touch помимо создания кучи пустых файлов есть первичная функция изменять даты файлов: touch -mat 202007081215.25 файл Можно использовать вместо -t ключ -d, который принимает строковое значение. Для полной исторической достоверности назначим всем каталогам в дату соответствующий названию год: for y in {2011..2020}; do touch -mad $y+"-01-01 00:00:00" $y ; done
Перенаправление вывода
Про /dev/null я знаю, но 2>&1 пришлось загуглить.
0 — STDIN, 1 — STDOUT и 2 — STDERR По умолчанию, если вы не укажете номер, то будет подразумеваться STDOUT. Необходимо поставить амперсанд "&" перед номером назначения.
Перенаправить вывод с STDERR и STDOUT в помойку (оба варианта идентичны):
>/dev/null 2>&1 >/dev/null 2>/dev/null
Использованные ссылки:
|