Копировать различия между двумя каталогами в новый каталог?

Отредактированная версия для поспешного вопроса!

Когда я запускаю diff в двух каталогах, например: $ diff Linux1 Linux2

Вывод будет $ Only в Linux2: COMPLETELYDIFFERENT22.txt

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

0
задан 19 January 2018 в 15:23

1 ответ

Если я вас правильно понял, вы хотите сравнить файлы в двух каталогах и скопировать файлы с различным содержимым в третий каталог. Я не вижу способа сделать это с помощью одной команды (если вы не пишете свой собственный скрипт или функцию). Но одной из сильных сторон оболочки bash является то, что вы можете объединять команды, используя выходные данные одной команды в качестве входных данных для следующей.

Во-первых, вы можете использовать diff как обычно:

diff -q dir1/ dir2/

Это даст вам вывод в соответствии с

Files dir1/file2.txt and dir2/file2.txt differ
Files dir1/file3.txt and dir2/file3.txt differ

Теперь вам нужно извлечь пути к файлам из этот вывод. Для этого вы можете использовать несколько команд: cut, grep, sed, awk или другие. Я буду использовать awk в этом примере и извлекать файлы из dir2:

diff -q dir1 dir2 | awk -n '{ print $4 }'

Вывод этого конвейера будет выглядеть примерно так

dir2/file2.txt
dir2/file3.txt

. быть переданы в xargs следующим образом:

diff -q dir1 dir2 | awk -n '{ print $4 }' | xargs -d '\n' -I {} cp {} target-dir/

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

1
ответ дан 19 January 2018 в 15:23

Другие вопросы по тегам:

Похожие вопросы: