LINUX.ORG.RU

find, xargs, grep, rm, пробелы.


0

1

find /mnt/share/backup/incr/YK/ -mtime +30 | grep -v main | xargs rm -rf

Этот скрипт должен удалять папки и файлы внутри YK старше 30 дней, не затрагивая папку main (linux я вижу второй раз в жизни и возможно ошибся с целью скрипта). Но он не справляется со своей задачей, выводя ошибку о неверном ключе у rm.

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

find /mnt/share/backup/incr/YK/ -mtime +30 -print0 | xargs -0 grep -v main |xargs -0 rm -rf

Но и он провалился: xargs: строка аргументов слишком велика xargs: grep: завершён по сигналу 13

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

> ... rm -rf

Дата регистрации: 31.03.2011 19:30:06


странно как-то

doctorx ★★★★
()

find /mnt/share/backup/incr/YK/ -mtime +30 '!' -path '*/main/*' -exec rm -rvf '{}' \;

(для начала потренируйтесь на кошках)

AITap ★★★★★
()
Ответ на: комментарий от AITap

Работоспособное решение, правда удалилась и папка main.

Вот пометка от человека, который всё это поднимал.

При помощи rsync создается зеркало сетевых ресурсов (папка main) где постоянно обновляются файлы, например общих папок или папок с пользовательскими данными. Если при синхронизации rsync находит обновление файла, он создает папку с датой, кладет туда старую версию файла, а main помещает самую свежую версию.

AndrewK
() автор топика
Ответ на: комментарий от AndrewK

Для этого и предлагалось тренироваться на кошках.
Попробуйте изменить '!' -path '*/main/*' на '!' -path '/mnt/share/backup/incr/YK/main/*'.

AITap ★★★★★
()
Ответ на: комментарий от AITap

find /mnt/share/backup/incr/YK/1test/ '!' -path '/mnt/share/backup/incr/YK/1test/main/*'

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

AndrewK
() автор топика
Ответ на: комментарий от AndrewK

/* поправка: find /mnt/share/backup/incr/YK/1test/ '!' -path '/mnt/share/backup/incr/YK/1test/main*' */

Эта штука удаляла бы мэйн?

Нет, но она бы пользовалась xargs, чего хотелось бы избежать (например, чтобы не превышать кол-во допустимых аргументов).

AITap ★★★★★
()
Ответ на: комментарий от AITap

Без звёздочки в конце выводит только содержимое мейна.

find /mnt/share/backup/incr/YK/1test/ '!' -path '/mnt/share/backup/incr/YK/1test/main' '!' -path '/mnt/share/backup/incr/YK/1test/main/*'

А вот такая конструкция уже делает всё по плану.

Большое вам спасибо за помощь!

AndrewK
() автор топика
Ответ на: комментарий от AITap

Хех, ваше решение оказалось более красивым.

И ещё раз, больше вам спасибо!

AndrewK
() автор топика
Ответ на: комментарий от n01r

> -prune
Точно, спасибо.

Окончательный вариант: find /mnt/share/backup/incr/YK/1test/ -path '/mnt/share/backup/incr/YK/1test/main' -mtime +30 -prune -o -exec rm -rvf '{}' \;
(тестовый запуск: find /mnt/share/backup/incr/YK/1test/ -path '/mnt/share/backup/incr/YK/1test/main' -mtime +30 -prune -o -print - с обязательным указанием -print).

AITap ★★★★★
()
IFS=$'\n'
for i in `find /mnt/share/backup/incr/YK/ -mtime +30 |grep -v main`; do rm -rf "$i"; done

// Как вариант.

anon_666
()
Ответ на: комментарий от AITap

find /mnt/share/backup/incr/YK/1test/ '!' -path '/mnt/share/backup/incr/YK/1test/main*' -mtime +30 -exec rm -rf '{}' \;

find /mnt/share/backup/incr/YK/1test/ -path '/mnt/share/backup/incr/YK/1test/main' -mtime +30 -prune -o -exec rm -rf '{}' \;

Разницы же в работе нету, правда в первом случае используется миниатюрный костылёк.

Тогда ещё один вопрос:

rm -rf '{}'

rm -rf


Что добавят фигурные скобки? Это для борьбы с пробелами?

AndrewK
() автор топика

find /mnt/share/backup/incr/YK/ -mtime +30 -delete

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.