Знайдіть файли новіші за день і скопіюйте


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

Однак вищезазначене для циклу призводить до того ж випуску, всі файли копіюються. Якщо я повторюю $ файли, відображаються лише потрібні мені файли.

Як я можу змусити це працювати?


1
Гаразд, я думаю, у мене це працює, використовуючи:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234

Чи не буде rsync кращим інструментом для цього завдання замість cp? rsync - джерело призначення
Дарріл

Відповіді:


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варіанти EAD, які він копіює. Можливо, тут також корисно. (але не включені у вищевказану команду)

    • -lчорнило - яке створює жорсткі посилання, якщо це можливо, а не копіювання файлових даних.

    • -Xдля обмеження одного paxі того ж джерельного пристрою та / або файлової системи.

    • -s/src regex/replace/ - яка змінює назви файлів у потоці

    • -verbose - для повідомлення про файли, які отримуються / націлюються.

  • -T- -Tопція imme вибирає файли для цільового архіву (або просто копіювати при використанні -wr), виходячи з часу їх /mвідхилення або inode /change (або обох) . Він за замовчуванням модифікує час. З ...

людина pax

  • ... Порівняння часу з використанням обох часових файлів корисно, коли 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

  • ... вибрав би всі файли з модифікацією або зміною inode часу 12:34 вечора сьогодні чи пізніше.

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

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

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


2

Дякуємо всім за допомогу, працюючи за допомогою комбінації ваших пропозицій:

пішов із наведеним нижче кодом, і він працює чудово.

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

знову дякую!


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 до папки (за 1 день до сьогодні :)

Будьте обережні з символом для команди find, це НЕ це: "це ось такий, зворотній вибір:` Вибір дати відбувається з цим: "

Для файлів з пробілами, вкладками, новинними рядками або символами підказки можна використовувати будь-яке рішення від Stéphane Chazelas, перше - для 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 {} +


Дякую Стефане, тому, можливо, я не міг знайти це в жодному пості, хоча для мого випадку це працювало як шарм. коли це робиш лише знаходиш. -тип 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 (обмежувальний коефіцієнт переносимості wrt - це -newermtпредикат)).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.