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 touch
um 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 find
implementaçõ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 find
em 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 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 à resposta de terdon NÃO funciona, pois funcionará apenas touch
no 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