7

Возможно ли в linux найти каталоги, в которых все содержащиеся в них файлы и каталоги (и файлы подкаталогов и т.д.) Старше указанного возраста? Другими словами, если в каталоге есть один или несколько файлов, которые имеют дату модификации более позднюю, чем заданный порог, этот каталог не должен быть указан в списке. Если все файлы и папки ниже этого каталога старше указанного порогового значения, этот каталог должен быть указан в списке.

Сценарий использования состоит в том, что мой домашний каталог полон скрытых каталогов, и я уверен, что многие из них остались от предыдущих установок и программного обеспечения, которое я не использовал годами. Мне бы хотелось найти эти каталоги, чтобы я мог легко решить, следует ли их отбирать.

5 ответов5

6

Возможно, это можно сделать без создания файлов с использованием подстановки процессов или чего-то еще, но вот быстрое и грязное решение:

find . -type f -mtime +30 -printf '%h\n' | sort | uniq > old.txt
find . -type f -mtime -30 -printf '%h\n' | sort | uniq > new.txt
grep -vf new.txt old.txt

Первая команда выводит путь к каждому файлу, измененному более 30 дней назад (в find -printf - по крайней мере, с помощью GNU find в моей системе - %h печатает весь путь, кроме фактического имени файла), затем сортирует их и избавляется от любых дубликатов и помещает все это в файл с именем old.txt .

Вторая команда делает то же самое, но с каждым файлом, измененным менее 30 дней назад, и помещает их в другой файл, new.txt .

Строка grep печатает каждую строку из old.txt, которая не отображается в new.txt, поэтому она выдаст вам список каталогов, содержащих только те файлы, которые были последний раз изменены более 30 дней назад.

Это все с использованием версий утилит GNU. Я не знаю, совпадает ли синтаксис в версиях BSD и т.д.

3

Наконец-то разобрался с волшебным однострочником:

for dir in `find . -type d -mtime +30`; do test `find $dir -type f -mtime -30 -print -quit` || echo $dir; done

При этом печатаются все каталоги, время модификации которых превышает 30 дней, а файлы не изменялись в течение последних 30 дней.

1

Этот должен работать:

for DIR in {the folder list}; do
   if [[ $(find ${DIR} -mtime -10 -type f) == "" ]]; then 
        echo ${DIR}
   fi
done

Он находит все каталоги в {списке папок}, который содержит файлы старше 10 дней.

В основном, метод find ${DIR} -mtime -10 -type f состоит в том, чтобы найти все файлы (-type f), которые были изменены в течение 10 дней (-mtime -10 , что отличается от -atime или -ctime , см. Здесь для дополнительная информация: http://www.cyberciti.biz/faq/howto-finding-files-by-date/). Если такие файлы не найдены в каталоге, мы знаем, что этот каталог старше 10 дней, и мы выводим этот каталог с помощью echo ${DIR} .

Надеюсь, поможет!

0
find -type f -mtime +30

проверить файлы старше 30 дней

если вы добавите -iname '.*' он покажет вам скрытые файлы

или -type d для каталогов

0

Вы можете использовать следующий обходной путь для реализации ваших потребностей:

$ touch -t 201206010100 some_file
$ find . -newer some_file

На сенсорной странице man:

-t STAMP
    use [[CC]YY]MMDDhhmm[.ss] instead of current time

Есть также опция касания -d, но я ее не использовал. Вы можете попробовать.

[Изменить] вы можете использовать опцию touch -d следующим образом, чтобы сгенерировать файл на определенную дату:

$ touch -d "Wed Jun 27 09:44:44 EEST 2012" some_file
$ ls -l some_file
-rw-r--r-- 1 user user 0 2012-06-27 09:44 some_file

Вы можете использовать тот же подход, который я упоминал выше

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .