Shell Script - Получить все файлы, модифицированные после <date> - PullRequest
129 голосов
/ 11 мая 2009

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

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

Ответы [ 9 ]

131 голосов
/ 11 мая 2009

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

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

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

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
89 голосов
/ 11 мая 2009

Если у вас есть 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, чтобы гарантировать его удаление, даже если пользователь прерывает, и так далее, и так далее.

31 голосов
/ 24 февраля 2014

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

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

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

17 голосов
/ 11 мая 2009

Это будет работать для некоторого количества файлов. Вы хотите включить «-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

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

12 голосов
/ 11 мая 2009

Здесь должны отображаться все файлы, измененные за последние 7 дней.

find . -type f -mtime -7 -print

Отправьте это в tar / zip, и вы должны быть хорошими.

3 голосов
/ 15 января 2016

Я бы просто сделал следующее для резервного копирования всех новых файлов за 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"

3 голосов
/ 11 мая 2009

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

find . -mtime -x

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

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

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

3 голосов
/ 11 мая 2009

в Linux, попробуйте прочитать справочную страницу команды find

man find

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

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

и у вас есть

2 голосов
/ 20 июля 2012

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...