Adicionar recursivamente um arquivo a todos os subdiretórios

13

Como adiciono (ou toco) recursivamente 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

para dentro

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

9 directories, 10 files
Trevor Hickey
fonte

Respostas:

14

E se:

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 será executado cp file DIR_NAME/em cada um deles.

terdon
fonte
ou encontre. -type d -exec touch file {} \;
ChuckCottrill
1
ou,find . -type d -exec touch {}/file\;
Ned64 08/09/2015
5

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

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

Na festança:

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

Portably, 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ê deseja copiar algum conteúdo de referência, precisará chamar findem loop. No zsh:

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

Na festança:

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

Portably:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +
Gilles 'SO- parar de ser mau'
fonte
2

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 por terdon NÃO funciona, pois apenas toucho 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 será criada aqui.

C König
fonte
0

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

$ find . -type d -exec touch {}/file \;
miked
fonte