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

Отредактированная версия к срочному вопросу!

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

Вывод: $ Only в Linux2: COMPLETELYDIFFERENT22.txt

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

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Выходные данные будут отличаться, что приведет к сбою вырезки имени файла. Кроме того, имена файлов не должны содержать пробелов, потому что это также может привести к сбою.

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