Як перевірити, які файли будуть скопійовані командою cp?


11

Я створюю простий сценарій, який копіює всі файли з DIRECTORYA, які не існують у DIRECTORYB. Я роблю це за допомогою команди cp:

cp -u DIRECTORYA/* DIRECTORYB

Що я хотів би зробити, це також надіслати електронний лист адміністратору, який перелічить файли, скопійовані.

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

Чи може хтось вказати мені в правильному напрямку? Я розглядав використання grep, але не думаю, що це можна зробити за допомогою команди cp?


1
Можливо, я нерозумію ваше запитання, але чи не можете ви використовувати -vпрапор, щоб надрукувати файли, коли вони копіюються? Перенаправити це на файл або безпосередньо в змінну і використовувати його для створення свого повідомлення.
ThibautRenaux

Крім того, cpкоманда має опцію, --attributes-onlyяка дозволяє не копіювати файлові дані, а лише каталоги та структуру файлів.
Костас

Вибачте, що я досить новачок в сценарії. Якщо я використовую прапор -v, як я можу вивести змінну замість файлу?
Джеймс

1
Якщо припустити, що ви використовуєте bash, variable=$(cp -v ...)фіксує stdout cp. Дивіться gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham

Відповіді:


4

Я не думаю, що GNU не cpможе нічого тобі допомогти, якщо ти хочеш побачити, що це зробить без дії. Якщо ви хочете увімкнути змінити файли, ви можете скористатися -vпараметром:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

Замість цього cpви можете використовувати rsync , який набагато потужніший та встановлений майже скрізь, за винятком вбудованих систем низького класу (та їх легко встановити там, де його за замовчуванням немає).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

або

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log

3

Відповідно до сторінки керівництва ,

-u, скопіюйте лише тоді, коли файл SOURCE новіший за цільовим файлом або коли файл відсутній--update

це особливість, яка поєднує в собі два тести, тривіальне для реалізації в сценарії ( відсутнє ) та те, що вимагає певної роботи ( новіше ). Ви можете створити сценарій, який повідомляє про те, що потрібно використовувати comm, diffі test.

Жодна із стандартних cpутиліт не забезпечує можливість операції копіювання на сухій основі. Як було запропоновано, rsyncце спосіб зробити це за допомогою загальнодоступної утиліти. Звичайно, rsyncзазвичай використовується для копіювання на основі більше критеріїв, ніж просто новіші або відсутні (також використовуються розмір файлу та часові позначки). Але це можна звести до того, щоб робити просто cp -u.

Для нестандартних утиліт є copyутиліта, про яку я писав (і звичайно досі користуюся) наприкінці 1980-х. Це, мабуть, було натхнене makeутилітою, оскільки перший варіант, який я додав, був -n.

Для наведеного прикладу він буде використаний так:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Подальше читання:

  • утиліта копіювання файлів / каталогів

    -n вимикає фактичне створення або модифікацію файлів і (залежно від рівня багатослівності) показує ефект, який copy мала би мати команда.
    -u копіює файли лише в тому випадку, якщо їх розмір або дата модифікації відрізняються, а посилання лише, якщо текст посилання відрізняється.
    -U копіює лише ті файли, які новіші за призначенням або не існують у пункті призначення.

  • запис змін у серпні 1988 року :

    1988-08-16    
            * src / copy / src / copy.c: додано параметри "-d" та "-n".
    

2

Якщо ви хотіли бігати cp foo*bar whatever, то echo foo*bar whateverзамість цього запустіть .


1
Але ОП хоче запуститись, cp -uі він шукає опцію для цп.
Аркадіуш Драбчик

0

Ви можете використовувати команду diff. У мене є робота, яка щодня копіює деякі резервні файли. якийсь час мені потрібно перевірити, чи всі файли скопійовані, ось синтаксис:

diff /file1/ /file2/

і, звичайно, якщо ви хочете скопіювати їх, використовуйте:

cp -u /file1/* /file2

0

Поміркуйте замість цього rsync. Rsync прекрасно працює на локальних примірниках і, безумовно, може робити все, що завгодно, перебравши п'ятнадцять газильйонів варіантів.

rsync -avun DIRECTORYA/ DIRECTORYB

покаже вам усе, що було б зроблено, і

rsync -avu DIRECTORYA/ DIRECTORYB

зробимо це.

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