Shell Script - Отримайте всі файли, змінені після <date>


136

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

Мені потрібен сценарій, який працює через каталог рекурсивно і знаходить, що всі файли з останньою зміненою датою перевищують якусь дату. Тоді він буде націлювати та копіювати файли, що зберігають інформацію про шлях.


14
Гарне рішення не робити цього в PHP.
Креднс

1
Ви можете використовувати будь-яку з пристойних мов сценарію оболонок, наприклад, python, ruby, perl, не вдаючись до php.
гарня

3
@garrow Це насправді було б досить просто в PHP, використовуючи рекурсивнийDirctoryIterator, інкрустований у FilterIterator.
Артефакто

Відповіді:


136

так просто, як:

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 нижче про те, як поводитися з пробілами у назвах файлів
Brian Henk

8
Перетворення довільної позначки часу у дробову, відносну кількість часу не здається ні правильною, ні особливо зручною. Рішення нижче , використовуючи -newermtце набагато краще.
Боббі Джек

5
При спробі витягнути будь-які файли зі змінами в структурі з каталогами, самі каталоги позначаються модифікованими, викликаючи архівування всієї папки. Додати -type fлише до вибраних файлів. Це підтримує структуру папок, але створює резервні копії лише файлів із змінами.
Brent

1
@BrianHenk user104848 змінив ім'я, я впевнений, що ти маєш на увазі цю відповідь від Джейсона Лютера, хоча
icc97

4
Питання вимагає знайти файли за довільною датою. Ця відповідь - як знайти файли за довільною кількістю днів у минулому. Я не думаю, що це має бути прийнятою відповіддю без додавання кроку для перетворення дати в дельту дня.
Марк

91

Якщо у вас є 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забезпечити його видалення, навіть якщо користувач перебиває, і так далі, і так далі.


65
Натомість ви можете використовувати, -newermt '2009-01-03T12:31:43'щоб уникнути необхідності створювати файл лише для довідки.
Майкл Міор

@MichaelMior: Цікаво - "знайти" на MacOS X 10.7.2 підтримує -newermt(документально підтверджено, -newerXYоскільки існує декілька варіантів; X = m, Y = t в цьому випадку). Знахідка GNU у (майже архаїчних) системах Linux, якими я користуюся, не підтримує варіанти, тому це порівняно недавній прихід. Дякую за голову вгору
Джонатан Леффлер

Цей параметр присутній у пошуку GNU 4.4.2, який я використовую у своїй системі.
Майкл Міор

2
Також зауважте, що GNU також знаходить підтримку порівняно, тобто. -newermt '-2 weeks'.
Кіболік

1
-newermt '2009-01-03T12:31:43'виглядає приголомшливо, але, на жаль, здається, що все трактується в неправильний часовий пояс: list.gnu.org/archive/html/bug-findutils/2012-12/msg00009.html
antoine

35

Це можна зробити безпосередньо за допомогою дьогтю, а ще краще:

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

Це дає вказівку tar для стиснення файлів новіших, ніж 1 січня 2014 року, 18:00:00.


9
Ага ... Я користуюся Unix з 1984 року і ніколи цього не знав. Завжди чомусь вчитися.
Джон

Реалізації, tarякі поставляються з OS X та FreeBSD, підтримують лише те, --newerщо є довготривалим варіантом -Nу GNU tar.
нісетама

Це дивовижно ... Я міг би змусити його працювати лише з bzip, не використовуючи -xcvf та gz розширення ... але я не експерт.
філ

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, тому вам доведеться bzip2 або gzip на другому кроці.


1
Щодо другого пункту, ви можете використовувати команду tar з підтримкою gzip, наприклад опцію -z Gnu tar, і для оновлення архівів, що зберігаються в zip.
Suncat2000

Або додайте опцію 'j', щоб використовувати bzip в останніх тарілках GNU
hd1

3
Як я вже говорив вище у відповідь Джонатана, це захопить папки, які мають зміни, які спричиняють імпорт всіх їхніх файлів. Додати -type fлише до вибраних файлів. Це підтримує структуру папок, але створює резервну копію лише файлів із змінами, доданими нещодавно.
Brent

12

Це має відображати всі файли, змінені протягом останніх 7 днів.

find . -type f -mtime -7 -print

Зробіть це в дьоготь / блискавку, і ви повинні бути хорошими.


3

добре під linux спробуйте прочитати man на сторінці команди find

man find

щось подібне повинно

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

і ти це маєш


3

Ви можете отримати список файлів, востаннє змінених пізніше x днів тому:

find . -mtime -x

Тоді вам просто потрібно націлити та заархівувати файли у наведеному списку, наприклад:

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

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


3
"-mtime x" відповідає файлам, зміненим точно "x" днів тому, використовуйте "-mtime -x", щоб відповідати файлам, зміненим менше, ніж "x" днів тому.
Ленс Річардсон

3

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

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

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.