LINUX.ORG.RU

8
Всего сообщений: 167

Как удалить сотни тысяч файлов по критерию: старше n дней?

Как удалить сотни тысяч файлов по критерию: старше n дней?

Есть директория с файлами сессий PHP. Они не удалялись несколько лет, их сотни тысяч. В PHP есть сборщик мусора, он настраивается специальным параметром, он есть, но почему-то не работает.

Нужно поудалять все старые сессии.

Эта команда не работает (удалить старше n дней):

find /your/path/* -mtime +n -exec rm {} \;

Получаю ошибку:

/bin/find: Argument list too long

Пробовал удалять в mc с помощью сортировки по дате и выделением клавишей ins. Это долго.

Вопросы:

  1. Можно ли в mc выделять сразу страницу из файлов? Не по одному с ins, а весь видимый список файлов.
  2. Как это сделать лучше?

 , , , ,

dopedopedope ()

Пробел в названии файла,полученный через переменную, как переместить?

Всем привет.Моё детище, Если в названии файла пробел, то будет ошибка. Переименовать, внутри переменой, у меня никак не выходит, может, поможете с перемещением файла с пробелом в названии?

#!/bin/bash

#ищем файлы с расширением .mkv, .m4v

Downloads_file=$(find /volume1/Geroev_Avenue_18/Downloads/ -maxdepth 1 -type f \( -iname "*.mkv" -or -iname "*.m4v" -or -iname "*.mp4" \) -and -mmin +5 -exec basename "{}" ';' | sed -n '1p' ); 

echo $Downloads_file

Downloads_file_film=$(find /volume1/Geroev_Avenue_18/Downloads/ -maxdepth 1 -type f \( -iname "*.mkv" -or -iname "*.m4v" -or -iname "*.mp4" \) -and -mmin +5 | sed -n '1p' );

#проверяем наличие найденного файла & отправляем сообщение в Телеграмм

if [ -n "$Downloads_file_film" ]; then mv -nfv $Downloads_file_film /volume1/Geroev_Avenue_18/Shared_Videos/Films/ && curl -X GET -k "https://api.telegram.org/bot18:9agk/sendMessage?chat_id=-4140&text=Films for PLEX App has been updated, file is "$Downloads_file""; 

fi

Спаибо

 , , ,

skyspirit ()

Чудеса с временем модификации

У меня в /etc/cron.weekly есть скрипт очистки старых билдов

find /storage/builds -type d -links 2 -mtime +365 | xargs rm -rf

Билды там лежат лежат разные, с разной структурой каталогов, поэтому я ищу последний каталог в дереве чтобы не удалить лишнего. -links 2 это магия, выдающая как раз последние каталоги в дереве.

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

Cтруктура примерно следующая

storage
 └─builds
    └─someproject      
       └─100500             Sep 24  2019
          └─client          Sep 29  2020
          │  └─client.rpm   Sep 24  2019
          └─server          Sep 29  2020
             └─server.rpm   Sep 24  2019

Билд случился больше года назад, а потом кто-то изменил время модификации каталогам client и server. Причём время изменено только у каталогов попадающих в выдачу find и сделано это в течении недели после того как им исполнился год. Поэтому главный подозреваемый - сам запускающийся раз в неделю скрипт очистки, который почему-то вместо удаления обновил время модификации. C -ctime ситуация та же. Случай не единичный, таких довольно много.

Как и почему такое может произойти? У меня только версия бага в файловой системе.

 , ,

pinus_nigra ()

Способы отслеживания изменений директории рекурсивно

Чтобы не создавать полные бекапы тех же данных, когда нужно создавать именно полные бекапы, но только при наличии изменений с момента предыдущего бекапа, ищу наиболее простой и эффективный способ отслеживания изменений. По сути мне не нужно знать, какие файлы изменились, что в них изменилось, а достаточно знать о факте изменения даже 1 файла.

Действие происходит на десктопе, не на сервере. Десктоп включается и выключается.

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

find /source -mtime -1 -print -quit

Если есть хотя бы 1 строка в выводе - запускать бекап. Разумно или стоит применить что-то другое?

 , ,

NightWillCome ()

Распаковать *.tar.bz2 в скрипте

Добрый день. Пишу в командной строке

/usr/bin/find ./ -type f -name "*.bz2" -exec /usr/bin/tar -xjf {} \;

Работает правильно. Ставлю в скрипт -

tar (child): bzip2: Функция exec завершилась с ошибкой: Нет такого файла или каталога
tar (child): Error is not recoverable: exiting now
/usr/bin/tar: Child returned status 2
/usr/bin/tar: Error is not recoverable: exiting now

со строчкой

for f in *.tar.bz2; do /usr/bin/tar -xvf "$f"; done

То же самое.

С конструкцией

find | xargs

То же самое

В пути вместо ./ ставил `pwd` - не помогло. Как же заставить это работать из скрипта?

 , ,

wlads ()

Удаление пустых папок

Имеется каталог со множеством файлов и папок, необходимо удалить файлы старше 15 дней + следом удалить пустые папки и подпапки. Сделал под это дело два скрипта и засунул в крон. Скрипт №1 отрабатывает, все ок. Но Скрипт №2 удаляет пустые папки только в родительском каталоге, а подпапки нет. Например, если в пустой папке родительского каталога есть еще одна пустая папка, то он ее пропускает. Что нужно указать в команде, чтобы удаление происходило рекурсивно?

Скрипт №1: find /common/«ОбщаяПапка»/ -type f -mtime +15 -exec rm {} ; Скрипт №2: find /common/«ОбщаяПапка»/ -type d -empty -exec rmdir {} ;

 , , ,

grraf ()

Подсчет веса файлов от предеоенной даты в папке без подкоталоге

Добрый день, возник вопрос как можно подсчитать вес файлов в папке без файлов в подпапке от определенной даты На bash Пример /А/ файлы весят 10мб /А/А1 файлы весят 100мб /A/a1/a2 файлы весят 15 мб

Пробовал через функцию Find ${direct} -mtime +{last_update} -type f -exec du -h {} ; Где ${direct} директория в которой надо подсчитать {last_update} время не позже которого нужно считать файлы -maxdepth в моей версии не работает Обновить нет возможности

 ,

puzik ()

Ошибочный? вывод команды find

Суток. В директории лежат файлы. Каждый новый файл добавляется раз в день или реже.

ls -lt

total 34621280
-rw-rw-r-- 1 user user 3476920320 Feb  1 23:30 dab-2021-02-01.tar
-rw-rw-r-- 1 user user 3476234240 Jan 31 23:30 dab-2021-01-31.tar
-rw-rw-r-- 1 user user 3456747520 Jan 30 23:30 dab-2021-01-30.tar
-rw-rw-r-- 1 user user 3456716800 Jan 29 23:30 dab-2021-01-29.tar
-rw-rw-r-- 1 user user 3547637760 Jan 28 23:30 dab-2021-01-28.tar
-rw-rw-r-- 1 user user 3547402240 Jan 27 23:30 dab-2021-01-27.tar
-rw-rw-r-- 1 user user 3547299840 Jan 26 23:30 dab-2021-01-26.tar
-rw-rw-r-- 1 user user 3745863680 Jan 25 23:30 dab-2021-01-25.tar
-rw-rw-r-- 1 user user 3539210240 Jan 21 23:30 dab-2021-01-21.tar
-rw-rw-r-- 1 user user 3658106880 Jan 20 23:30 dab-2021-01-20.tar

Из man ls

-t     sort by modification time, newest first

Дальше, я хочу с помощью find найти файлы, которые модифицированы 6*24 и более часов назад.

Из man find

-mtime n
File's  data was last modified n*24 hours ago.

Ищу

find -type f -mtime +6

./dab-2021-01-21.tar
./dab-2021-01-25.tar
./dab-2021-01-20.tar

Сейчас 8:40 по мск. Значит при поиске файлов 24*6 (144 часа и старше) find должен уже искать файлы, модифицированные раньше 27 января 8:40. Почему файл от 26 января не попадает в этот список?

 , ,

TisyachaChertey ()

Перенаправление вывода внутри exec

Задаются три параметра: расширение, название каталога и другое расширение. Нужно найти внутри каталога все файлы с заданным расширением и хвостовую часть файла записать в файл, название которого формируется так: «имя исходного файла.третий параметр». Вот кусок кода:

find ./$2 -name «*.$1» -exec tail {} >> «{}.$3» ;

Вместо того, чтобы имена найденных файлов подставлять в {}.$3, он создает файл с именем {}.«$3», и записывает все туда. Что здесь нужно переписать, чтобы работало как надо?

 , ,

JoannaDevis ()

Проблема с поиском файлов с помощью find

Добрый день. Задача: найти все файлы в определенной директории, расположенной в root. (используется в программке одной…)

Для этого использовал команду find.

Выглядит это примерно так:

find . -path  './Layer/host/*' -type f

Одна проблема - работает только тогда, когда я в руте.

Нужно чтобы эту команду можно было запускать и из других директорий.

Попытался решить таким образом

find . -path '/Layer/host/*' -type f

Запускается, но вывод пуст.

Что делать??

 , ,

Hart ()

Как подставить переменную в аргумент команды?

Нужно удалить самый новый файл. Нашел как выводить имя этого файла, записал в переменную, но последняя команда(find) не срабатывает. Если вручную ввести аргумент имени, к примеру file1 все в порядке. Что я делаю не так?

sefi=$(find ./lab2 -type f -printf ‘%f \n’ | sort -r | head -n 1 )

echo $sefi find ./lab2 -name «$sefi» -exec rm -f {} ; #-type f -printf ‘%f \n’

 , , ,

hateallpeople ()

find и scp

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

Попробовал сделать вот так но результат не тот что нужен find -name «24.11.2020» -exec scp -rpC {} root@terminal.gmi.ru:/home/test_q/ \;

Если искать find -name «24.11.2020» выдаёт полный путь до папки home/test/test_a/24.11.2020, далее запускается scp и на удалённом сервере создаёт папку 24.11.2020 и выкладывает туда все файлы и папки из исходных папок 24.11.2020 и при каждом копировании запрашивает пароль.

А нужно чтобы при выполнении команды на удаленном сервере в папке test_q создавалась отдельная папка с путём на 2-а уровня выше, то есть test_q/test/test_a/24.11.2020 далее test_q/test/test_b/24.11.2020, и так по найденному списку с копированием всех вложений и папок, при этом не вводить пароль на каждый файл из списка.

Подскажите как можно подправить команду.

 , ,

supp0rtmail2019 ()

find + copy

Всем привет, подскажите чукче как рекурсивно после find всё скопировать в опеределённый каталог.
Грубо говоря нужно что-то подобное
/usr/bin/find /etc/letsencrypt/archive/ -type f -mtime -30 -exec /usr/bin/scp -r "{}" /etc/letsencrypt/export \;
но в {} у меня вываливается только отфильтрованное из первого попавшегося каталога, все остальные игнорятся и тупо копируются в export.

 , ,

gidrotormoz ()

Как найти и удалить код из большого количества файлов

Подскажите пожалуйста как удалить код в несколько строк от вируса из множества файлов. Несколько вариантов встречающегося кода:

if (file_exists(get_template_directory() . DIRECTORY_SEPARATOR . '.' . basename(get_template_directory()) . '.php')) {
	include_once get_template_directory() . DIRECTORY_SEPARATOR . '.' . basename(get_template_directory()) . '.php';
}
if (file_exists($filename = dirname(__FILE__) . DIRECTORY_SEPARATOR . '.' . basename(dirname(__FILE__)) . '.php') && !class_exists('WPTemplatesOptions')) {
    include_once($filename);
}

 , ,

gmyz ()

Помощь в написании скрипта

Добрый день, У меня есть несколько папок с файлами, мне нужно создать текстовый файл в котором будет прописан путь к файлу потом его содержимое, и так просканировать все папки и записать все в 1 файл

Данной командой я определяю пути: find ./ -type f Командой: find./ -type f | xargs cat >> file.txt я собираю все содержимое файлов во всех папках в один файл

Я не понимаю как сделать поочередную запись сначала путь и название потом содержимое

 , ,

kuller255 ()

find '*[0-9]{3}*'

извините,, но не могу найти как find использовать рег выражения.. типа

ls |grep -E ‘[0-9]{3,}

но find ./ -name ‘[0-9]{3,}’ -ненаходит но и не ругается

как правильно синтаксис в find?

 

flat ()

Ротация файлов и папок

Всех привествую. Есть такая задача. На сервере лежат папки подобного строения. В которыз лежат архивы бэкапов

/opt/backup/*/*/pg/2020/09/07

даты естественно меняются в зависимости от созданного бэкапа

Сливаются они по FTP с других хостов. Теперь условия, которые я не знаю как реализовать в скрипте.

/opt/backup/*/*/pg/2020/09/07

хочется чтоб проверялась папка с месяцем по маске

/opt/backup/*/*/pg/*/*/* 

и удаляла все старые папки, которые старше 14 дней, затем поднималась на папку выше, т.е. шла проверка месяца /opt/backup///pg// и так же проверяла изменения за последние 14 дней, в общем такое же действие и с годом.

Все это можно реализовать с помощью

find /opt/backup/*/*/pg/*/*/* -type d -mtime +336

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

 , , , ,

shift-47 ()

Поиск файлов с каким-то кол-вом комментариев

Есть что-то готовое? Нужно пройтись по проекту и прочекать файлы, в которых есть n комментарий. Чтобы можно было:

  1. вывести их список, чтобы открыть текстовым редактором и пофиксить
  2. подсунуть в pre-commit

 , , ,

bryak ()

Удаление файлов через команду find

Приветствую Всех! У меня вопрос в каталоге нужно удалить определенные файлы c маской например console.log.2.1.1.1 а некоторые оставить такие как console.log.2 + не проверять папку catalog1

При команде:

find /var/log/test/ -path «catalog1» -prune -o ! -name «log.*.*» -type f -exec rm -rf {} \;

Удаляет все файлы в /var/log/test - console.log.2.1.1.1 и console.log.2

 , ,

troy856 ()

find -o и -mmin

Доброго времени суток. Подскажите пожалуйста новичку по команде find. Цель: Найти файлы который изменялись за последние 3 часа, по маске из нескольких имен.
Операционная система AIX 7.
Вот так все работает: find ./ -name "*.txt" -mmin -180
А вот так уже нет: find ./ -name "*.txt" -o -name "*.dat" -mmin 180 - команда уже выведет все файлы *.txt. Пробовал вот так - find ./ -name "*.txt" -mmin -180 -o -name "*.dat" mmin -180 не работает выдает ошибку. Пробовал в скобки выражение добавлять - выдает ошибку. Помогите пожалуйста с командой или покажите направление куда копать.

 

raptor855 ()