Я бы предпочел не делать этого в PHP, поэтому я надеюсь, что кто-то, достойный в сценариях оболочки, может помочь.
Мне нужен script, который проходит через каталог рекурсивно и обнаруживает, что все файлы с последней измененной датой больше, чем какая-либо дата. Затем он деактивирует и заархивирует файл (ы), сохраняя информацию о пути.
так же просто, как:
find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz
где find . -mtime -1
выберет все файлы в (рекурсивном) текущем каталоге, измененном днем ранее. вы можете использовать дроби, например:
find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
-newermt
намного приятнее.
Если у вас есть 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
, чтобы он был удален, даже если пользователь прерывает и т.д. и т.д.
-newermt '2009-01-03T12:31:43'
чтобы избежать необходимости создавать файл только для справки.
-newermt
(задокументировано под -newerXY
так как есть несколько опций; X = m, Y = t в этом случае). Поиск GNU в (почти архаичных) системах Linux, которые я использую, не поддерживает опции, так что это относительно недавнее появление. Спасибо за внимание.
Вы можете сделать это непосредственно с помощью tar и даже лучше:
tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files
Это дает команду tar сжимать файлы с 1 января 2014 года, 18:00:00.
tar
которые поставляются с OS X и FreeBSD, поддерживают только --newer
который является длинным параметром для -N
в GNU tar
.
Это будет работать для некоторого количества файлов. Вы хотите включить "-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 его на втором шаге.
Это должно показать все файлы, измененные за последние 7 дней.
find . -type f -mtime -7 -print
Труба, которая находится в tar/zip, и вы должны быть хорошими.
хорошо под linux попробуйте прочитать man-страницу команды find
man find
что-то вроде этого должно
find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9
и у вас есть
Вы можете получить список файлов, последний измененный позже, чем x дней назад, с помощью:
find . -mtime -x
Тогда вам просто нужно создать tar и zip файлы в результирующем списке, например:
tar czvf mytarfile.tgz `find . -mtime -30`
для всех файлов, измененных в течение последнего месяца.
Я бы просто сделал следующее для резервного копирования всех новых файлов с 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"
Этот 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
.
Выделите этот репозиторий GitHub: ZFYL/zipper
Если вы поместите index.php и zipper.php в любом месте вашего сервера, через главную страницу вы можете либо просмотреть файлы, которые были изменены между двумя датами, либо zip-them.
Основные функции:
Кстати, этот инструмент PHP очень быстрый, а может работать через 20 000 файлов в 5 сек. в худшем сценарии.
Также вы можете включить zipper.php библиотеку кода в любом php файле и вызвать встроенные функции, которые вы можете найти в вики-репозитории ( Использование функций из ZFYL zipper в вашем коде).