Как проверить, какие файлы будут скопированы с помощью команды cp?

11

Я создаю простой скрипт, который копирует все файлы из DIRECTORYA, которые не существуют в DIRECTORYB. Я делаю это с помощью команды cp:

cp -u DIRECTORYA/* DIRECTORYB

Я хотел бы также отправить электронное письмо администратору, в котором будут перечислены скопированные файлы.

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

Кто-нибудь может указать мне правильное направление? Я изучил использование grep, но не думаю, что это можно сделать с помощью команды cp?

Джеймс
источник
1
Может быть, я неправильно понимаю ваш вопрос, но вы не можете использовать -vфлаг, чтобы напечатать имена файлов по мере их копирования? Перенаправьте это в файл или непосредственно в переменную и используйте это для создания вашего сообщения.
ThibautRenaux
Дополнительно в cpкоманде есть опция, --attributes-onlyпозволяющая не копировать данные файлов, а только структуру каталогов и файлов.
Костас
Извините, я довольно новичок в написании сценариев. Если я использую флаг -v, как я могу вывести переменную вместо файла?
Джеймс
1
Предполагая, что вы используете bash, variable=$(cp -v ...)захватывает стандартный вывод 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
Жиль "ТАК - перестань быть злым"
источник
2

Если вы хотели бежать cp foo*bar whatever, то бегите echo foo*bar whateverвместо этого.

Vato
источник
Но ОП хочет бежать, cp -uи он ищет вариант, подобный пробному запуску для cp.
Аркадиуш Драбчик,
2

Согласно странице руководства ,

-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

Дальнейшее чтение:

  • copy - утилита копирования файлов / каталогов

    -n отключает фактическое создание или изменение файлов и (в зависимости от уровня подробности) показывает эффект, который copy будет иметь команда.
    -u копирует файлы, только если их размер или дата изменения отличаются, а ссылки только, если текст ссылки отличается.
    -U копирует только файлы, которые новее, чем место назначения, или которые не существуют в месте назначения.

  • запись в журнале изменений за август 1988 года :

    1988-08-16    
            * src / copy / src / copy.c: добавлены опции "-d" и "-n".
    
Томас Дики
источник
0

Вы можете использовать команду diff. У меня есть работа, которая копирует некоторые файлы резервных копий каждый день. Некоторое время мне нужно проверить, все ли файлы скопированы, вот синтаксис:

diff /file1/ /file2/

и, конечно, если вы хотите скопировать их, используйте:

cp -u /file1/* /file2
poori
источник
0

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

rsync -avun DIRECTORYA/ DIRECTORYB

покажет вам все, что будет сделано, и

rsync -avu DIRECTORYA/ DIRECTORYB

сделаю это.

Эдвард Фальк
источник