Shell Script - Получить все файлы, измененные после <дата>

104

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

Мне нужен script, который проходит через каталог рекурсивно и обнаруживает, что все файлы с последней измененной датой больше, чем какая-либо дата. Затем он деактивирует и заархивирует файл (ы), сохраняя информацию о пути.

  • 13
    Хорошее решение не делать это в PHP.
  • 1
    Вы можете использовать любой из приличных языков сценариев оболочки, например, python, ruby, perl, не прибегая к php.
Показать ещё 1 комментарий
Теги:

10 ответов

104
Лучший ответ

так же просто, как:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

где find . -mtime -1 выберет все файлы в (рекурсивном) текущем каталоге, измененном днем ​​ранее. вы можете использовать дроби, например:

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
  • 4
    Посмотрите ответ user104848 ниже о том, как бороться с пробелами в именах файлов
  • 7
    Преобразование произвольной временной метки в дробное относительное количество времени не кажется ни правильным, ни особенно удобным. Решение ниже с использованием -newermt намного приятнее.
Показать ещё 3 комментария
69

Если у вас есть GNU find, тогда есть легион соответствующих параметров. Единственное препятствие в том, что интерфейс к ним меньше звездного:

  • -mmin n (время модификации в минутах)
  • -mtime n (время модификации в днях)
  • -newer file (время модификации, превышающее время модификации файла)
  • -daystart (отрегулируйте время начала с текущего времени до начала дня)
  • Плюс альтернативы для времени доступа и "изменения" или "создания" времени.

Жесткая часть определяет количество минут с момента времени.

Один из вариантов стоит рассмотреть: используйте touch для создания файла с требуемой меткой времени изменения; затем используйте find с -newer.

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

Это ищет файлы, более поздние, чем 2009-01-03T12: 31: 43. Очевидно, что в script, /tmp/wotsit будет именем с PID или другим значением, чтобы сделать его уникальным; и был бы trap, чтобы он был удален, даже если пользователь прерывает и т.д. и т.д.

  • 59
    Вместо этого вы можете использовать -newermt '2009-01-03T12:31:43' чтобы избежать необходимости создавать файл только для справки.
  • 0
    @MichaelMior: Интересно - 'find' в MacOS X 10.7.2 поддерживает -newermt (задокументировано под -newerXY так как есть несколько опций; X = m, Y = t в этом случае). Поиск GNU в (почти архаичных) системах Linux, которые я использую, не поддерживает опции, так что это относительно недавнее появление. Спасибо за внимание.
Показать ещё 8 комментариев
29

Вы можете сделать это непосредственно с помощью tar и даже лучше:

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

Это дает команду tar сжимать файлы с 1 января 2014 года, 18:00:00.

  • 8
    Да ... Я использую Unix с 1984 года и никогда не знал этого. Всегда чему-то научиться.
  • 0
    Реализации tar которые поставляются с OS X и FreeBSD, поддерживают только --newer который является длинным параметром для -N в GNU tar .
Показать ещё 1 комментарий
17

Это будет работать для некоторого количества файлов. Вы хотите включить "-print0" и "xargs -0", если любой из путей имеет в них пробелы. В этом примере просматриваются файлы, измененные за последние 7 дней. Чтобы найти те, которые были изменены до последних 7 дней, используйте "+7".

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

Как эта страница предупреждает, что xargs может вызвать выполнение команды tar несколько раз, если есть много аргументов, а параметр "- c" может вызвать проблемы. В этом случае вам понадобится следующее:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

Вы не можете обновить архив tar с tar tar, поэтому вам нужно будет bzip2 или gzip его на втором шаге.

  • 1
    Что касается второго пункта, вы можете использовать команду tar с поддержкой gzip, такую как опция -z в Gnu tar, для обновления также сжатых архивов.
  • 0
    Или добавьте опцию 'j', чтобы использовать bzip в последних версиях GNU.
Показать ещё 1 комментарий
9

Это должно показать все файлы, измененные за последние 7 дней.

find . -type f -mtime -7 -print

Труба, которая находится в tar/zip, и вы должны быть хорошими.

3

хорошо под linux попробуйте прочитать man-страницу команды find

man find

что-то вроде этого должно

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

и у вас есть

3

Вы можете получить список файлов, последний измененный позже, чем x дней назад, с помощью:

find . -mtime -x

Тогда вам просто нужно создать tar и zip файлы в результирующем списке, например:

tar czvf mytarfile.tgz `find . -mtime -30`

для всех файлов, измененных в течение последнего месяца.

  • 3
    «-mtime x» соответствует файлам, измененным ровно «x» дней назад, используйте «-mtime -x» для сопоставления файлов, измененных меньше, чем «x» дней назад.
2

Я бы просто сделал следующее для резервного копирования всех новых файлов с 7 дней назад

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

Заметьте, что вы также можете заменить "7 дней назад" на все, что вам подходит.

Может быть: date -d'yesterday' +"%d-%b"

Или даже: date -d'first Sunday last month' +"%d-%b"

2

Этот script найдет файлы, имеющие дату изменения за две минуты до и после указанной даты (и вы можете изменить значения в условиях согласно вашему требованию)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

Например, вы хотите, чтобы файлы имели дату модификации до указанной даты, вы можете изменить 120 на 0 в параметре $DIFF_IN_DATE, отменяя условия параметра $DIFF_IN_DATE1.

Аналогично, если вы хотите, чтобы файлы имели дату изменения за 1 час до и после указанной даты, просто замените 120 на 3600 в if CONDITION.

0

Выделите этот репозиторий GitHub: ZFYL/zipper

Если вы поместите index.php и zipper.php в любом месте вашего сервера, через главную страницу вы можете либо просмотреть файлы, которые были изменены между двумя датами, либо zip-them.

Основные функции:

  • Рекурсивные каталоги поиска
  • Найти файлы, измененные между двумя датами/временем
  • Список этих файлов
  • ZIP эти файлы
  • Исключить пути с RegEx

Кстати, этот инструмент PHP очень быстрый, а может работать через 20 000 файлов в 5 сек. в худшем сценарии.

Также вы можете включить zipper.php библиотеку кода в любом php файле и вызвать встроенные функции, которые вы можете найти в вики-репозитории ( Использование функций из ZFYL zipper в вашем коде).

  • 0
    Вы бы сделали хороший продавец, братан. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню