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