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