Как правильно скопировать файл в несколько папок и подпапок, не перезаписывая содержимое файла в целевых папках?

Я на самом деле попробовал существующий ответ от: Как скопировать файл в несколько папок с помощью командной строки? где я использовал команду:

find folder -exec cp file.txt {} \;

Я хотел использовать это, потому что я хотел скопировать один файл с именем "file.txt" в каталог с именем "папка" и все его подкаталоги без упоминания всех каталогов в команде.

Однако, в конечном итоге это заменило содержимое каждого файла в "папке" и его подпапках содержимым "file.txt". Например, если внутри папки находится файл "foo.txt", он все равно сохранит имя "foo.txt", но все его содержимое будет заменено на "file.txt". Это озадачило меня, и я попробовал следующий интерактивный флаг:

find folder -exec cp -i file.txt {} \;

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

Может кто-нибудь помочь мне разобраться, что происходит и какой должна быть соответствующая команда?

1 ответ

Решение

Вы должны ограничить find только перечисление каталогов:

find folder -type d -exec cp file.txt {} \;

Кроме того, в будущем, когда вы cp находясь в каталоге, имя которого происходит от какой-либо другой команды, используйте -t вариант, чтобы убедиться, что это действительно каталог:

find folder -type d -exec cp -t {} file.txt \;

От man cp:

-t, --target-directory=DIRECTORY
      copy all SOURCE arguments into DIRECTORY

Таким образом, если файл предоставляется в качестве аргумента -t, cp будет автоматически жаловаться.

Другой ответ на этот вопрос использует -type d,

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