Adicionar recursivamente um arquivo a todos os subdiretórios

10

Como recursivamente adiciono (ou toco) um arquivo ao diretório atual, bem como a 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
    
por Trevor Hickey 09.10.2013 / 05:28

4 respostas

14

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

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

    
por 09.10.2013 / 05:50
5

Se você quiser apenas criar um arquivo vazio, você pode usar touch e um shell glob. Em zsh:

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

No bash:

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

Portável, você pode usar find :

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

Algumas implementações de find , mas não todas, permitem que você escreva find . -type d -exec touch {}/file \;

Se você deseja copiar algum conteúdo de referência, você deverá chamar find em um loop. Em zsh:

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

No bash:

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

Portável:

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

Ao querer touch arquivos 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 para a resposta por terdon NÃO funciona, pois só touch o arquivo chamado $ name no diretório atual e o próprio diretório.

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

    
por 08.09.2015 / 14:18
0

Para criar apenas um arquivo, você pode usar touch com find :

$ find . -type d -exec touch {}/file \;
    
por 10.08.2014 / 06:36