Рекурсивно добавить файл во все подкаталоги

13

Как я могу рекурсивно добавить (или коснуться) файл в текущий каталог, а также во все его подкаталоги?

Например,
я хотел бы включить это дерево каталогов:

.
├── 1
   ├── A
   └── B
├── 2
   └── A
└── 3
    ├── A
    └── B
        └── I   
9 directories, 0 files

в

.
├── 1
   ├── A
      └── file
   ├── B
      └── file
   └── file
├── 2
   ├── A
      └── file
   └── file
├── 3
   ├── A
      └── file
   ├── B
      ├── file
      └── I
          └── file
   └── file
└── file

9 directories, 10 files
Тревор Хикки
источник

Ответы:

14

Как насчет:

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

От man find:

   -type c
          File is of type c:
           d      directory

   -exec command ;
          Execute  command;  All following arguments to find are taken 
          to be arguments to the command until an  argument  consisting 
          of `;' is encountered.  The string `{}' is replaced by the 
          current file

Итак, команда выше найдет все каталоги и запустит cp file DIR_NAME/на каждом из них.

Тердон
источник
или найти. -типа d -exec touch file {} \;
ChuckCottrill
1
илиfind . -type d -exec touch {}/file\;
Нед64
5

Если вы просто хотите создать пустой файл, вы можете использовать touchи оболочку. В зш:

touch **/*(/e:REPLY+=/file:)

В Баш:

shopt -s globstar
for d in **/*/; do touch -- "$d/file"; done

Портативно, вы можете использовать find:

find . -type d -exec sh -c 'for d; do touch "$d/file"; done' _ {} +

Некоторые findреализации, но не все, позволяют писатьfind . -type d -exec touch {}/file \;

Если вы хотите скопировать некоторый справочный контент, то вам придется звонить findв цикле. В зш:

for d in **/*(/); do cp -p reference_file "$d/file"; done

В Баш:

shopt -s globstar
for d in **/*/; do cp -p reference_file "$d/file"; done

Портабельно:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +
Жиль "ТАК - перестань быть злым"
источник
2

Если вам нужны touchфайлы с именем $ name в текущем каталоге и во всех подкаталогах, это будет работать:

find . -type d -exec touch {}/"${name}"  \;

Обратите внимание, что комментарий ChuckCottrill к ответу terdon НЕ работает, так как он будет содержать только touchфайл с именем $ name в текущем каталоге и сам каталог.

Он не будет создавать файлы в подкаталогах в соответствии с запросом OP, в то время как эта версия здесь будет.

С Кениг
источник
0

Чтобы на самом деле просто создать файл, вы можете использовать touchс find:

$ find . -type d -exec touch {}/file \;
miked
источник