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 в вашем коде).