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

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

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

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

.
├── 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

решение1

Как насчет:

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/для каждого из них.

решение2

Если вы просто хотите создать пустой файл, вы можете использовать touchи shell glob. В zsh:

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цикл. В zsh:

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' _ {} +

решение3

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

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

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

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

решение4

Другой пример, который я только что тестировал, учитывая ваш пример, — это создание последовательных файлов в определенном подкаталоге, как у меня здесь.

├── FOLDER
│   ├── FOLDER1
│   └── FOLDER2
├── FOLDER
│   ├── FOLDER1
│   └── FOLDER2
└── FOLDER
    ├── FOLDER1
    └── FOLDER2

Я использовал эту команду ниже, чтобы создать только в каталоге FOLDER2 файлы с последовательной числовой последовательностью, напримерfile{1..10}

for d in **/FOLDER2/; do touch $d/file{1..10}.doc; done

Связанный контент