Shell Script-получить все файлы, измененные после
Я бы предпочел не делать этого в PHP, поэтому я надеюсь, что кто-то приличный в скриптах оболочки может помочь.
Мне нужен скрипт, который рекурсивно проходит через каталог и находит все файлы с последней измененной датой больше некоторой даты. Затем он будет tar и zip файл(ы), сохраняя информацию о пути.
10 ответов
просто:
find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz
здесь find . -mtime -1
выделит все файлы в (рекурсивно) текущем каталоге, измененном накануне. вы можете использовать дроби, например:
find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
если у вас есть 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. Ясно, по сценарию,/tmp/wotsit
будет имя с PID или другим значением, чтобы сделать его уникальным; и будет trap
чтобы убедиться, что он получает удаляется, даже если пользователь прерывает, и так далее и тому подобное.
вы можете сделать это непосредственно с помощью tar и даже лучше:
tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files
это инструктирует tar сжимать файлы новее, чем 1 января 2014, 18:00: 00.
это будет работать для некоторого количества файлов. Вы хотите включить "- print0" и "xargs -0", Если в любом из путей есть пробелы. В этом примере выполняется поиск файлов, измененных за последние 7 дней. Чтобы найти те, которые были изменены до последних 7 дней, используйте "+7".
find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2
As на этой странице предупреждает, xargs может привести к выполнению команды tar несколько раз, если есть много аргументов, и флаг "-c" может вызвать проблемы. В таком случае, вы хотели бы это:
find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.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"
этот скрипт найдет файлы, имеющие дату изменения за две минуты до и после указанной даты (и вы можете изменить значения в условиях в соответствии с вашим требованием)
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
to 0
на $DIFF_IN_DATE
параметр, отбрасывающий условия
проверьте этот репозиторий GitHub: ZFYL / молния
Если вы разместите индекс.php и молния.php в любом месте вашего сервера, через mainpage вы можете либо просто просмотреть файлы, которые были изменены между двумя датами, либо zip-их.
основные функции:
- поиск каталогов рекурсивно
- найти файлы, измененные между данными двумя дата / время-s
- список тех файлов
- ZIP эти файлы
- исключить пути-es с RegEx
кстати, этот PHP инструмент супер быстрый, и может работать через 20 000 файлов в 5 secods в худшем случае.
также вы можете включить молния.в PHP библиотека кода в любом php файле и вызов встроенных функций, которые вы можете найти в вики репозитория ( использование функций из zfyl zipper в вашем коде).