Eu tenho um diretório com vários subdiretórios. Assim
/usr/local/src/ccl/ccl-1.8/x86-headers$ ls
elf gl gmp gnome2 gtk2 jni libc
Cada um desses diretórios tem um subdiretório adicional C
dentro dele, que contém um arquivo populate.sh
. Eu quero criar um grupo paralelo de subdiretórios com a mesma estrutura, mas com um valor aleatório acrescentado ao nome do diretório (o valor aleatório deve ser o mesmo em todos os casos) e contendo apenas o subdiretório C com o arquivo populate.sh
. Esses diretórios contêm outros arquivos além do arquivo populate.sh
.
Isto é para um makefile, portanto, a simplicidade provavelmente deve usar utilitários unix padrão. Estou pensando em encontrar com o -exec
flag, ou possivelmente xargs
funcionaria, mas estou tendo problemas para entender a documentação, e tenho pouca experiência com scripts de shell. O Perl pode funcionar, mas eu não o usei e prefiro não usá-lo aqui.
Estou usando algo como mktemp -u --tmpdir=.
para gerar uma string aleatória no passado, mas dificilmente é ideal, por isso estou aberto a outras sugestões. Idealmente, gostaria de um nome que pareça libc.tmp_xw3st
. Ie. tmp_
seguido por uma sequência alfanumérica de 5 dígitos.
Até agora, tenho uma maneira de obter uma listagem dos diretórios de nível superior. : -)
find . -maxdepth 1 -type d -print0
../gmp./jni./gl./elf./libc./gtk2./gnome2
Uma lista de diretórios mais completa está no final desta postagem. Para resumir, quero criar diretórios adicionais, como x86-headers/libc.tmpvalue
, que contém apenas o arquivo adicional x86-headers/libc.tmpvalue/C/populate.sh
.
Um esboço de uma possível abordagem é lidar com isso em duas etapas, como segue:
Etapa 1: execute a lista de diretórios de nível superior usando find
e crie uma estrutura de diretório correspondente, por exemplo, dirname.tmpvalue/C/
usando exec
ou canalizando para xargs
e usando mkdir -p
.
Etapa 2: execute novamente a lista de diretórios de nível superior e cp populate.sh
nos subdiretórios C
. Isso é um pouco desleixado, porque a lista de diretórios, em teoria, poderia ter sido alterada entre as duas invocações de find
, mas isso não é um problema neste caso.
/usr/local/src/ccl/ccl-1.8/x86-headers$ ls -laR
[...]
./jni:
total 96
drwxr-sr-x 3 faheem staff 4096 Jul 31 00:53 .
drwxr-sr-x 9 faheem staff 4096 Jul 31 00:53 ..
drwxr-sr-x 2 faheem staff 4096 Jul 31 00:53 C
-rw-r--r-- 1 faheem staff 19535 Jul 31 00:53 constants.cdb
[more .cdb files]
./jni/C:
total 12
drwxr-sr-x 2 faheem staff 4096 Jul 31 00:53 .
drwxr-sr-x 3 faheem staff 4096 Jul 31 00:53 ..
-rw-r--r-- 1 faheem staff 148 Jul 31 00:53 populate.sh
./libc:
total 1276
drwxr-sr-x 3 faheem staff 4096 Jul 31 00:53 .
drwxr-sr-x 9 faheem staff 4096 Jul 31 00:53 ..
drwxr-sr-x 2 faheem staff 4096 Jul 31 00:53 C
-rw-r--r-- 1 faheem staff 593125 Jul 31 00:53 constants.cdb
[more .cdb files]
./libc/C:
total 20
drwxr-sr-x 2 faheem staff 4096 Jul 31 00:53 .
drwxr-sr-x 3 faheem staff 4096 Jul 31 00:53 ..
-rwxr-xr-x 1 faheem staff 10544 Jul 31 00:53 populate.sh