Найти и удалить непустую папку старше 3 дней

Это может быть достигнуто за счет использования очень простой -машины состояний:

$ awk -v OFS="\t" '/^[A-Z][A-Z]/ && !/^BO/ { flag=0 } /^BO/ { flag=1 } flag == 1 && NF == 4 { $4 = sprintf("%.2f", 1+$4) } { print }' file
AK
  v       0.00u      0.00       0.00       0.00       0.00       0.00       0.00
        398.56       0.00       0.00       0.00       0.00       0.00       0.00
        398.56      50.00       0.00       0.00       0.00       0.00       0.00
          0.00      50.00       0.00       0.00       0.00       0.00       0.00
          0.00       0.00       0.00       0.00       0.00       0.00       0.00
BO
v       25.00o  18.75   15.00
v       75.00o  18.75   15.00
v       323.56o 18.75   15.00
v       373.56o 18.75   15.00
EN

Сценарий ничего не делает, кроме как передает ввод к выводу, пока не дойдет до строки, начинающейся с BO, затем устанавливает flagв 1.

Если flagравно 1 и текущая строка содержит четыре столбца, четвертый столбец переформатируется с использованием sprintf()и 1+$4. Спецификация формата %.2fозначает «значение с плавающей запятой с двумя десятичными разрядами».

Если в начале строки найдено что-то отличное от BO, flagсбрасывается на ноль.

Заполнение между столбцами изменяется в выходных строках, где была сделана модификация. Это связано с тем, что awkразбивает поля на пробелы, а затем объединяет их, используя OFS(, установленный здесь как символ табуляции ), когда происходит вывод.

Чтобы получить точно такой же выходной формат, как и входной, вы можете сделать что-то вроде

$ awk -v OFS="\t" '/^[A-Z][A-Z]/ && !/^BO/ { flag=0 } /^BO/ { flag=1 } flag == 1 && NF == 4 { printf("%3s %11s%10.2f %10.2f\n", $1,$2,$3,1+$4); next } { print }' file
AK
  v       0.00u      0.00       0.00       0.00       0.00       0.00       0.00
        398.56       0.00       0.00       0.00       0.00       0.00       0.00
        398.56      50.00       0.00       0.00       0.00       0.00       0.00
          0.00      50.00       0.00       0.00       0.00       0.00       0.00
          0.00       0.00       0.00       0.00       0.00       0.00       0.00
BO
  v      25.00o     18.75      15.00
  v      75.00o     18.75      15.00
  v     323.56o     18.75      15.00
  v     373.56o     18.75      15.00
EN
0
22.11.2019, 18:46
2 ответа

Может быть что-то вроде этого:

find. -mindepth 1 -maxdepth 1 -not -empty -type d -mtime +3 -exec rm -rf {} \;

Это решение удалит непустые каталоги уровня 1, которые не редактировались touchболее трех дней.

Сделайте резервную копию ваших данных перед тестированием.

2
28.01.2020, 02:17

В оболочке zshне-пустые каталоги в /tmpс отметкой времени модификации более трех дней назад будут соответствовать шаблону подстановки имен файлов

/tmp/*(/DNFm+3)

Квалификатор glob (/DNFm+3)означает

  • Только соответствующие каталоги(/; это не обязательно, так как квалификатор Fподразумевал бы то же самое ),
  • Разрешить сопоставление скрытых имен(D; работает как опция оболочки dotglobв bash),
  • Расширяется до нуля, если совпадений нет(N; работает как опция оболочки nullglobв bash),
  • Включать только «полные» (не-пустые )каталоги (F),
  • Включать только те записи, которые имеют отметку времени модификации строго более трех дней назад(m+3; для каталогов это означает, что в последний раз что-то добавлялось или удалялось из каталога много дней назад; как и для find's -mtime +3, это означает4 дней или старше).

Чтобы просмотреть все совпадения, используйте

print -rC1 -- /tmp/*(/DNFm+3)

Для их удаления используйте

rm -rf -- /tmp/*(/DNFm+3)

Если таких совпадений несколько тысяч и вы сталкиваетесь с слишком длинным списком аргументов ошибок, используйте цикл:

for dirpath in /tmp/*(/DNFm+3); do
    rm -rf -- $dirpath
done

Или используйтеzargs:

autoload zargs
zargs -- /tmp/*(/DNFm+3) -- rm -rf

Или включите встроенную функцию rmс zmodload zsh/files, которая позволит обойти это ограничение системного вызова execve().

2
28.01.2020, 02:17

Теги

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