Найти файлы новее дня и скопировать

12

Я работаю над сценарием, который будет копировать ТОЛЬКО файлы, созданные за последний выходной день, в другую папку. У меня проблема в том, что у меня есть скрипт, который копирует все файлы в исходном каталоге, а не только файлы, которым меньше одного дня.

Вот что у меня есть:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

Приведенный выше код копирует все файлы в исходном каталоге. Если я уберу все аргументы для 'cp', то это сработает:

find . -mtime -1 -exec cp "{}" /somefolder \;

Приведенный выше код копирует только самые новые файлы, как я хочу, но мне нужно сохранить атрибуты, используя аргументы cp.

Я также пробовал переменные и для циклических размышлений, возможно, проблема была в опции -exec:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

Однако вышеприведенный цикл for приводит к одной и той же проблеме, все файлы копируются. Если я отображаю файлы $, отображаются только те файлы, которые мне нужны.

Как я могу заставить это работать?

mac1234
источник
1
Хорошо, я думаю, у меня это работает, используя:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234
Разве rsync не будет лучшим инструментом для этой задачи вместо cp? rsync -a источник назначения
Darryl

Ответы:

9

В некоторых реализациях cpесть -tопция, поэтому вы можете поместить целевой каталог перед файлами:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Обратите внимание, что -aподразумевает, --preserveпоэтому я удалил последний.

Гленн Джекман
источник
3

Вы можете использовать paxдля этого, как:

pax -wrT "11$(date +%H%M)," . /destination/folder

Командная строка побитовая:

  • -wr- когда paxвручается и -wобряд, и -rпочитание опций, он копирует. Возможно, также полезно здесь. (но не входит в вышеуказанную команду)

    • -lчернила - которые создают жесткие ссылки, если это вообще возможно, а не копируют данные файла.

    • -Xдля ограничения paxодним и тем же исходным устройством и / или файловой системой.

    • -s/src regex/replace/ - который изменяет имена файлов в потоке

    • -verbose - для создания отчетов о файлах / источниках.

  • -T- -Tопция ime выбирает файлы для целевого архива (или просто для копирования при использовании с ними -wr) на основе их времени /modification или inode /change (или обоих) . По умолчанию используется мод времени. От...

человек чел

  • ... Сравнение времени с использованием обоих времен файла полезно, когда pax используется для создания инкрементного архива на основе времени (будут архивироваться только файлы, которые были изменены в течение указанного временного диапазона).

  • Диапазон времени состоит из шести различных полей, и каждое поле должно содержать две цифры. Формат такой:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Где ccпервые две цифры года (века), yyэто последние две цифры года, первая mm- это месяц (с 01 по 12), ddэто день месяца (с 01 по 31), HHэто Часы дня (от 00 до 23), MMминуты (от 00 до 59) и SSсекунды (от 00 до 59). Поле минут MMявляется обязательным, а остальные поля являются необязательными и должны быть добавлены в следующем порядке:

    HH, dd, mm, yy, cc

  • SSПоле может быть добавлено независимо от других полей. Диапазоны времени относятся к текущему времени, поэтому ...

    -T 1234/cm

  • ... выбрал бы все файлы с модификацией или изменением инода сегодня или позже 12:34.

  • -TМожно указать несколько временных диапазонов и проверять остановки с первым совпадением.

... так 11что в моем примере команда относится к сегодняшнему дню - она ​​на единицу меньше сегодняшней даты, то есть двенадцатой, а остальное - просто стандартный "$(date)"формат, за которым следует запятая.

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

mikeserv
источник
2

Спасибо всем за помощь, она заработала, используя комбинацию ваших предложений:

пошел с приведенным ниже кодом, и он работает отлично.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

Спасибо еще раз!

mac1234
источник
2

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

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

где $ days - количество дней, $ tarpath - временный путь для хранения этих файлов. и когда я хотел восстановить.

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

Это помогло мне.

Примечание: если вы хотите исключить какую-либо папку во время резервного копирования, вы можете использовать следующую команду

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Преимущество: 1. У меня всегда была копия того, что я восстановил в прошлый раз в сжатом формате.

  1. также у меня есть пауза между восстановлением, где я могу пойти и проверить, что это за файлы и, если все в порядке, продолжить работу со сценарием.

  2. Он сохраняет структуру папок, поэтому просто перезаписывает измененные файлы из исходного каталога в целевой каталог

Примечание: с другой стороны, если требование не ограничено днем, я бы использовал rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

больше для rsyc с датой здесь

Амол Патил
источник
1

Можно также выбрать точную дату и время, кроме возврата к определенному количеству дней

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

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

Выше копирует все файлы в каталоге, которые были созданы после 17 декабря 2016 года 20:10:00, в FOLDER (за 1 день до сегодняшнего дня :)

Будьте осторожны с символом для команды поиска, это НЕ это: «это то, обратный удар:« выбор даты с этим: »

Для файлов с пробелами, символами табуляции, символами новой строки или подстановочными знаками в их именах вы можете использовать любое из решений Стефана Шазеля: первое - для GNU, второе - для GNU или некоторых BSD:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +
FatihSarigol
источник
1
Возможно, вам захочется прочитать Почему циклический вывод вывода находит плохую практику?
Стефан Шазелас
Спасибо Стефан, возможно, поэтому я не смог найти это ни в одном посте, хотя для моего случая это сработало как шарм. когда ты это делаешь только найди. -тип f -newermt '17 дек 2016 20:10:00 '
FatihSarigol
... он печатает файлы, созданные после этого времени, я не уверен, какую проблему это может вызвать сама. тогда я просто использую галочки, чтобы выбрать эти файлы для копирования. ура
FatihSarigol
Я полагаю, что пост, которым вы поделились, посвящен теме «Цикл повторен», мой код повторяет результат поиска? или это просто выбор результата поиска для использования при копировании? (Извините за 3 комментария, мне, видимо, еще не разрешено редактировать мои комментарии
FatihSarigol
1
Используйте find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) или find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU или некоторые BSD ( -newermtздесь предикатом является ограничивающий фактор в отношении переносимости )).
Стефан Шазелас