Рейтинг:0

Скрипт оболочки для удаления всех файлов определенного типа в разных папках, кроме 10 последних

флаг eg

Прежде всего, извините мой плохой английский.

Я пытаюсь написать сценарий оболочки для очистки некоторых файлов определенного типа в моих папках резервного копирования.

Мне нужно удалить файлы определенного типа, кроме 10 самых новых в каждой папке.

Структура папки выглядит так:

Корневая папка
✓
★ папка_1
â âââ файл_1.txt
â âââ файл_2.txt
â âââ file_n.txt
✓
★ папка_2
â âââ файл_1.txt
â âââ файл_2.txt
â âââ file_n.txt
✓
âââ папка_n
â âââ файл_1.txt
â âââ файл_2.txt
â âââ file_n.txt
✓

Я использовал скрипт из Дэвид Ферстер в качестве основы, но не могу понять, как заставить его работать в разных папках отдельно, не записывая вручную имя каждой папки в скрипте.

На данный момент скрипт выглядит так:

найти /volume1/rootfolder/ -type f -name *.txt -printf '%T@ %p\0' |
sort --zero-terminated --reverse --numeric-sort --field-separator=' ' --key 1,1 |
gawk -F ' ' -v RS='\0' -v ORS='\0' -v keep_count=10 \
  'НАЧАЛО { maxage = systime() - keep_younger_days * 24 * 3600; }
  (NR > keep_count) && (int($1) < maxage) { print(substr($0, length($1) + 2)); }' |
xargs -r0 -- гм --

Но проблема в том, что он удаляет все файлы во всех папках, кроме 10 последних. Итак, у меня всего 10 файлов во всех папках, а не по 10 в каждой папке.

Помогите, пожалуйста, разобраться, как сделать скрипт для обработки каждой папки отдельно.

флаг hr
Такого рода вещи проще в `zsh`, который имеет квалификаторы glob для выбора файлов на основе времени модификации. См., например, [Сценарий Bash: условное удаление старых файлов с сохранением последних копий](https://askubuntu.com/a/1352544/178692) или [Удалить все файлы в каталоге старше последних десяти файлов](https: //askubuntu.com/a/930709/178692)
флаг ng
Извините, @steeldriver. Надеюсь, вы не возражаете против вопроса — я просто подумал, почему бы не написать скрипт на Python? Иногда мне кажется проблематичным поддерживать Bash (в том смысле, что я согласен с расширением масштаба решения) ... будет ли это менее адекватным, по вашему личному мнению, если да, то почему?
флаг hr
@brezniczky Я просто имел в виду, что в zsh * проще, чем в bash * - я недостаточно хорошо владею python, чтобы комментировать его относительные достоинства.
флаг ng
@steeldriver хорошо, я - почти очевидно - не знаком с zsh, в любом случае спасибо на данный момент! может кто-нибудь с обеими/всеми 3 картами в руках когда-нибудь задаст вопрос и даст мне/нам ответ :)
Рейтинг:2
флаг cn

Вы делите его на две части. Во-первых, вы строите структуру каталогов, и в этом случае нам нужны только каталоги, содержащие файлы. Во второй части мы сначала сортируем самые новые файлы и пропускаем файлы с хвост.

#!/бин/баш

в то время как IFS= читать -rd ''; делать
    найти "$ ОТВЕТ" \
    -maxdepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' | сортировать -zk1rn | вырезать -zf2- | хвост -zn +$((10+1)) | xargs -r -0 эхо РМ
сделано < <( \
    найти $PWD/данные \
    -mindepth 2 -type f -printf %h\0 | сортировать -zu \
)

Также есть возможность использовать глобус с для цикла:

#!/бин/баш
shopt -s globstar nullglob

для в данных/*/**/; делать
    найти "$а" \
    -maxdepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' | сортировать -zk1rn | вырезать -zf2- | хвост -zn +$((10+1)) | xargs -r -0 эхо РМ
сделано

Наконец, мы используем массив счетчиков для отслеживания количества файлов:

#!/бин/баш

найти $PWD/data -mindepth 1 -type f -name '*.txt' -printf '%T@\t%p\0' \
    | сортировать -zk1rn | вырезать -zf2- \
    | awk -F / -vRS='\0' -vORS='\0' '{a=$0; NF=NF-1} b[$0]++ >= 10 {print a}' | xargs -r -0 эхо РМ
Nazar Tareyev avatar
флаг eg
Спасибо за ответ. Что делать, если глубина каталога больше 1? Я упростил структуру папок, чтобы упростить мой вопрос. Но реальная структура папок глубже и не фиксирована. Иногда мои целевые файлы находятся в нескольких каталогах, иногда больше или меньше.
bac0n avatar
флаг cn
Я использовал неправильный спецификатор. Вы можете добавить `-n 1` к `xargs` для лучшей читабельности.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.