С командами POSIX и при условии, что имена файлов и каталогов не содержат символов новой строки:
src=/some/dir
dst=/some/other/dir
file_list=/path/to/list.txt
(cd -P -- "$src" && find. |
tee -- "$file_list" |
pax -rwdpe -- "$dst")
Пути будут относиться к каталогам $src
или $dst
(, которые должны существовать заранее ).
Реализация GNU cp
(, найденная в Ubuntu ), имеет параметр -v
, который сообщает, что он делает.
LC_ALL=C cp -va -- "$src" "$dst" > "$file_list"
Будет создан list.txt
, который содержит что-то вроде:
'/some/dir' -> '/some/other/dir'
'/some/dir/file' -> '/some/other/dir/file'
[...]
Другим вариантом может быть использованиеtar
(нестандартной команды, но Ubuntu поставляется с GNU tar
по умолчанию):
(cd -P -- "$src" && tar cf -.) |
(cd -P -- "$dst" && tar xvf - > "$file_list")