Aqui estão duas maneiras de fazer isso. Há mais, mas o conceito seria o mesmo: ou estender o que você tem, ou iterar em uma lista e dividir cada item da lista em partes.
Longo caminho para fazer isso
Não há nada de especial que precise ser feito com touch
. Simplesmente estenda os mesmos argumentos que você tinha para o comando mkdir
para incluir arquivos.
bash-4.3$ mkdir -p mydir/{colors/{basic,blended},shape,animals/{mammals,reptiles}}
bash-4.3$ tree mydir
mydir
├── animals
│ ├── mammals
│ └── reptiles
├── colors
│ ├── basic
│ └── blended
└── shape
7 directories, 0 files
bash-4.3$ touch mydir/{colors/{basic/{red,blue,green},blended/{yellow,orange,pink}},shape/{circle,square,cube},animals/{mammals/{platipus,bat,dog},reptiles/{snakes,crocodile,lizard}}}
bash-4.3$ tree mydir
mydir
├── animals
│ ├── mammals
│ │ ├── bat
│ │ ├── dog
│ │ └── platipus
│ └── reptiles
│ ├── crocodile
│ ├── lizard
│ └── snakes
├── colors
│ ├── basic
│ │ ├── blue
│ │ ├── green
│ │ └── red
│ └── blended
│ ├── orange
│ ├── pink
│ └── yellow
└── shape
├── circle
├── cube
└── square
Caminho curto
Se você observar, todos os seus diretórios possuem arquivos para criar. Assim, o que podemos fazer é criar uma lista de itens (efetivamente um array bash) e iterar sobre eles, usando mkdir
com remoção de sufixo e, em seguida, touch
. Assim:
bash-4.3$ arr=( mydir/{colors/{basic/{red,blue,green},blended/{yellow,orange,pink}},shape/{circle,square,cube},animals/{mammals/{platipus,bat,dog},reptiles/{snakes,crocodile,lizard}}} )
bash-4.3$ for i in "${arr[@]}"; do mkdir -p "${i%/*}" && touch "$i"; done
bash-4.3$ tree mydir
mydir
├── animals
│ ├── mammals
│ │ ├── bat
│ │ ├── dog
│ │ └── platipus
│ └── reptiles
│ ├── crocodile
│ ├── lizard
│ └── snakes
├── colors
│ ├── basic
│ │ ├── blue
│ │ ├── green
│ │ └── red
│ └── blended
│ ├── orange
│ ├── pink
│ └── yellow
└── shape
├── circle
├── cube
└── square
7 directories, 15 files
Nota: se você tiver espaços em qualquer arquivo ou nome de diretório, certifique-se de citar uma ou duas citações desses itens, por exemplo:
arr=( mydir/{'with space',without_space/{file1,file2}} )