Я работаю над сценарием, который будет копировать ТОЛЬКО файлы, созданные за последний выходной день, в другую папку. У меня проблема в том, что у меня есть скрипт, который копирует все файлы в исходном каталоге, а не только файлы, которым меньше одного дня.
Вот что у меня есть:
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 приводит к одной и той же проблеме, все файлы копируются. Если я отображаю файлы $, отображаются только те файлы, которые мне нужны.
Как я могу заставить это работать?
источник
find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
Ответы:
В некоторых реализациях
cp
есть-t
опция, поэтому вы можете поместить целевой каталог перед файлами:Обратите внимание, что
-a
подразумевает,--preserve
поэтому я удалил последний.источник
Вы можете использовать
pax
для этого, как:Командная строка побитовая:
-wr
- когдаpax
вручается и-w
обряд, и-r
почитание опций, он копирует. Возможно, также полезно здесь. (но не входит в вышеуказанную команду)-l
чернила - которые создают жесткие ссылки, если это вообще возможно, а не копируют данные файла.-X
для ограниченияpax
одним и тем же исходным устройством и / или файловой системой.-s/src regex/replace/
- который изменяет имена файлов в потоке-v
erbose - для создания отчетов о файлах / источниках.-T
--T
опция ime выбирает файлы для целевого архива (или просто для копирования при использовании с ними-wr
) на основе их времени/m
odification или inode/c
hange (или обоих) . По умолчанию используется мод времени. От...человек чел
... Сравнение времени с использованием обоих времен файла полезно, когда 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
я в течение часа ругал себя под нос, путаясь со всеми странными результатами, пока не использовал абсолютный путь.источник
Спасибо всем за помощь, она заработала, используя комбинацию ваших предложений:
пошел с приведенным ниже кодом, и он работает отлично.
Спасибо еще раз!
источник
Я делал точно такую же функциональность, но мне нужно было сохранить структуру папок. Следовательно, то, что я сделал, немного отличается.
где $ days - количество дней, $ tarpath - временный путь для хранения этих файлов. и когда я хотел восстановить.
Это помогло мне.
Примечание: если вы хотите исключить какую-либо папку во время резервного копирования, вы можете использовать следующую команду
Преимущество: 1. У меня всегда была копия того, что я восстановил в прошлый раз в сжатом формате.
также у меня есть пауза между восстановлением, где я могу пойти и проверить, что это за файлы и, если все в порядке, продолжить работу со сценарием.
Он сохраняет структуру папок, поэтому просто перезаписывает измененные файлы из исходного каталога в целевой каталог
Примечание: с другой стороны, если требование не ограничено днем, я бы использовал rsync
больше для rsyc с датой здесь
источник
Можно также выбрать точную дату и время, кроме возврата к определенному количеству дней
(Это хорошо работает только в том случае, если в именах ваших файлов нет пробелов, табуляции или подстановочных знаков)
Выше копирует все файлы в каталоге, которые были созданы после 17 декабря 2016 года 20:10:00, в FOLDER (за 1 день до сегодняшнего дня :)
Будьте осторожны с символом для команды поиска, это НЕ это: «это то, обратный удар:« выбор даты с этим: »
Для файлов с пробелами, символами табуляции, символами новой строки или подстановочными знаками в их именах вы можете использовать любое из решений Стефана Шазеля: первое - для GNU, второе - для GNU или некоторых BSD:
источник
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
здесь предикатом является ограничивающий фактор в отношении переносимости )).