Чтобы скопировать все файлы из foo/
и bar/
в baz/
, самый простой способ - просто скопировать оба файла и позволить одному перезаписать другой:
cp --recursive foo/ baz/
cp --recursive bar/ baz/
Если вы хотите быть немного чище, а не копировать из bar/
все, что существует в foo/
, вы можете написать:
cp --recursive foo/ baz/
( cd bar/
find -exec bash -c ' if ! [[ -e ../foo/"{}" ]] ; then
cp "{}" ../baz/"{}"
fi
' \;
)
Вы можете использовать тот же подход для генерации списка файлов в bar/
, которые не существуют в foo/
:
( cd bar/
find -exec bash -c ' if ! [[ -e ../foo/"{}" ]] ; then
echo bar/"{}"
fi
' \;
)
(или вы можете изменить echo bar/"{}"
на printf %s\0 bar/"{}"
, чтобы использовать в качестве разделителя байт с нулевым значением, а не символ новой строки).
В качестве альтернативы вы можете написать:
diff --old-line-format=%L --new-line-format= --unchanged-line-format= \
<( cd foo/ ; find | sort ) <( cd bar/ ; find | sort )
, который передает выходные данные cd foo/ ; find | sort
и cd bar/ ; find | sort
в diff
в качестве входных файлов и указывает diff
распечатать строки, которые найдены only в первом входном файле и откажитесь от всего остального. (Примечание: это прервется, если какие-либо имена файлов будут содержать новые строки.)
Ничто из вышеперечисленного не сравнивает содержимое разных файлов просто потому, что я не уверен, что делать, если они разные. Изучение содержимого файла может использовать diff -r -q foo/ bar/
в качестве отправной точки, но что нам с этим делать?