Suponha que eu tenha uma estrutura de diretórios como esta:
$ [~ / prática] ls a / b / c / d /
Agora eu quero criar um diretório tmp1
em todos os subdiretórios practice
e faço isso:
$ [~ / practice] mkdir * / tmp1 mkdir: não é possível criar o diretório `* / tmp1 ': esse arquivo ou diretório não existe
Então eu tento o -p
switch e termino com um diretório nomeado *
com um subdiretóriotmp1
$ [~ / prática] mkdir -p * / tmp1 $ [~ / prática] ls * / a / b / c / d /
Eu sei que o uso do -p
switch é criar vários diretórios inexistentes. Eu apenas pensei que poderia ajudar.
Como crio tmp1
em todos os subdiretórios de uma só vez?
Se isso pode ser feito, como faço para estendê-lo para criar \tmp1
, \tmp2
, \tmp3
em \a
, \b
e \c
ao mesmo tempo?
Edit: eu perdi mencionar que os diretórios não tem que ser simples e em ordem, como a
, b
, c
etc., e o diretório a ser criado não é necessariamente como tmp1
, tmp2
.
$ [~ / prática] ls cão / gato / rato /
Neles, eu gostaria de ter algo como
$ [~ / prática] ls * cachorro: vermelho azul/ gato: vermelho azul/ rato: vermelho azul/
Respostas:
Com globs :
NOTA
*/
como um globSe você deseja criar vários subdiretórios ao mesmo tempo:
for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done
fonte
for i in */; do mkdir "$i/itemone" "$i/itemtwo"; done
por vários nomes de diretório não em ordem?fonte
Com o GNU ou BSD *, encontre:
ou usando expansão de parâmetro:
* Inclui OS X
fonte
find . -name . -o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;
Fora do tópico desde que você está mencionando
bash
, mas para o registro, com o zsh, você faria:$^var
ativa a expansão tipo braquete para a expansão da matriz. É uma reminiscência derc
's^
operador erc
(ou seus derivadoses
), você escrevê-lo:No entanto, observe (e o mesmo se aplica às soluções bash fornecidas aqui) que na solução rc
dirs
também conteria links simbólicos para diretórios. Na solução zsh, altere*(/)
para*(-/)
se você deseja incluir links simbólicos para diretórios.fonte
-p
sinalizador.Portably, faça um loop nos diretórios pai:
Adicione
--
depoismkdir
se você tiver diretórios cujo nome comece com-
.No zsh, você pode fazer isso em um único comando com o
e
qualificador glob :mas é mais rápido digitar isso como dois comandos:
fonte
mkdir -- whatever
e omitir--
se você pretende expandir o que quer que possa ser tomado como opção para omkdir
comando". Não faz sentido omitir--
aqui. Pode não ser um problema no caso do OP, mas é um no caso geral. Acho que temos o dever de ensinar a sintaxe correta e segura aqui.--
avisos necessários e citados e grandes avisos quando as novas linhas não são suportadas. Em um contexto de linha de comando, prefiro mostrar a versão rápida que funciona primeiro na prática e a versão à prova de balas como complemento.Você pode fazer isso assim:
fonte
Variação na resposta do sputnick que evita arquivos que não são de diretório:
fonte
if [ -d "$x" ];…
?Esta é uma boa versão do antigo Unix Masters (testado no FreeBSD 10.1) se você deseja controlar a versão (com o RCS bloqueado: ci -l com um breve comentário como ir: para o lançamento inicial) seus arquivos de configuração / etc / * em ~ / .his / etc
fonte
Deveria estar \! nomeie "RCS" e funcionará melhor no primeiro check-in.
sudo encontrar ~ /. his / etc \! -name "RCS" -ls
sudo encontrar -d ~ /. his / etc \! -name "RCS" | xargs sudo ci -l -mir -t-ir
Este último também funciona muito bem para o cjeck em parte, filtrando todo o conteúdo RCS no nome do arquivo:
sudo find -d ~ / .his / etc -tipo f | grep -v RCS | xargs sudo ci -l -mir -t-ir
fonte
isso é uma grande ajuda para mim. Eu precisava criar um conjunto de subdiretórios em várias pastas e algo como:
funcionou bem, exceto quando um espaço em branco é encontrado. existe uma maneira de ignorar espaços na
*/*/
parte dos argumentos?fonte