Usando find
, sort
e xargs
:
find . -maxdepth 1 -type f -name 'file_*.pdb' -print0 |
sort -zV |
xargs -0 cat >all.pdb
O comando find
localiza todos os arquivos relevantes e, em seguida, imprime seus nomes de caminho para sort
que faz uma "classificação de versão" para colocá-los na ordem correta (se os números dos nomes de arquivos foram preenchidos com zero) largura fixa não precisaríamos de -V
). xargs
pega essa lista de nomes de caminhos ordenados e executa cat
nestes grupos em lotes tão grandes quanto possível.
Isso deve funcionar mesmo se os nomes de arquivos contiverem caracteres estranhos, como novas linhas e espaços. Usamos -print0
com find
para fornecer nomes com sort
nul-terminados para classificar e sort
os manipula usando -z
. xargs
também lê nomes nul-terminados com seu -0
flag.
Observe que estou escrevendo o resultado em um arquivo cujo nome não corresponde ao padrão file_*.pdb
.
A solução acima usa alguns sinalizadores não padrão para alguns utilitários. Eles são suportados pela implementação GNU desses utilitários e pelo menos pelo OpenBSD e pela implementação do macOS.
Os sinalizadores não padrão usados são
-
-maxdepth 1
, para fazer com quefind
entre apenas no diretório mais superior, mas sem subdiretórios. POSIXly, usefind . ! -name . -prune ...
-
-print0
, para tornarfind
resultados de nomes terminados em nul (isto foi considerado por POSIX mas rejeitado). Pode-se usar-exec printf '%s
.-z
' {} + -
sort
, para fazer com que-V
leve registros nul-terminados. Não há equivalência POSIX. -
sort
, para tornar200
sort, por ex.3
após-0
. Não há equivalência POSIX, mas pode ser substituída por uma classificação numérica em partes específicas do nome do arquivo, se os nomes dos arquivos tiverem um prefixo fixo. -
xargs
, para fazerxargs
ler registros terminados em nulo. Não há equivalência POSIX. POSIXly, seria necessário citar os nomes dos arquivos em um formato reconhecido por-V
.
Se os nomes dos caminhos são bem comportados, e se a estrutura de diretório é plana (sem subdiretórios), então pode-se fazer sem esses sinalizadores, exceto por sort
with %code% .