Adicione recursivamente um arquivo a todos os subdiretórios

Adicione recursivamente um arquivo a todos os subdiretórios

Como adiciono (ou toco) recursivamente um arquivo no diretório atual, bem como em todos os subdiretórios?

Por exemplo,
eu gostaria de transformar esta árvore de diretórios:

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

em

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

9 directories, 10 files

Responder1

Que tal:

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

De 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

Assim, o comando acima encontrará todos os diretórios e será executado cp file DIR_NAME/em cada um deles.

Responder2

Se você deseja apenas criar um arquivo vazio, você pode usar touchum shell glob. Em zsh:

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

Na festa:

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

Portavelmente, você pode usar find:

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

Algumas findimplementações, mas não todas, permitem escreverfind . -type d -exec touch {}/file \;

Se você quiser copiar algum conteúdo de referência, terá que fazer uma chamada findem loop. Em zsh:

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

Na festa:

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

Portavelmente:

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

Responder3

Ao desejar toucharquivos chamados $name no diretório atual e em todos os subdiretórios, isso funcionará:

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

Observe que o comentário de ChuckCottrill à resposta de terdon NÃO funciona, pois funcionará apenas touchno arquivo chamado $name no diretório atual e no próprio diretório.

Ele não criará arquivos em subdiretórios conforme solicitado pelo OP, enquanto esta versão aqui o fará.

Responder4

Outro exemplo que acabei de testar é criar arquivos consecutivos em subdiretórios específicos, como os que tenho aqui.

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

Usei este comando abaixo para criar apenas no diretório FOLDER2 arquivos com sequência numérica consecutiva comofile{1..10}

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

informação relacionada