Crie o diretório chamado 0001 em vez de 1 em um loop de script do bash

10

No script bash a seguir, se j = 0000, como devo alterar o script bash a seguir para criar diretórios denominados 0001, 0002, ...? Na verdade, ele faz dirs nomeados 1, 2, 3

for i in *.jpg; do let j+=1 ; mkdir $j ; done

Obrigado!

Marcello
fonte

Respostas:

13

Seu script atual usa apenas um valor decimal - isso obviamente se traduz no valor sem zeros à esquerda.

Você teria que preencher a string com o comprimento de 4 caracteres, com zeros à esquerda. Você faz isso usando backticks ``para obter o resultado da chamada printf printf %04d $j.

Como resultado, você deve ter o comando completo:

for i in *.jpg; do let j+=1; mkdir `printf %04d $j`; done

Fonte: StackOverflow: bash - preenchimento de zeros em uma string

(Obviamente, veja também as respostas adicionais para essa pergunta, se você quiser uma solução mais aprofundada, mas isso definitivamente funciona perfeitamente para este caso de uso.)

user98085
fonte
5

Usando o bash, sua melhor opção é:

mkdir {0001..0666}

para criar dirs com nome 0001para 0666(com preenchimento zero).

Se você quiser diretórios chamado prefix0001suffix, prefix0002suffix... então:

mkdir prefix{0001..0666}suffix

vai fazer.

Se você deseja apenas nomes de diretório com números ímpares

mkdir {0001..0666..2}

e assim por diante ... Consulte Expansão de braçadeira no bashmanual de referência .

Como destaca FEichinger, você precisa saber com antecedência o número de diretórios. Se você deseja uma solução próxima à sua, mas realmente segura e usando o idioma bash mais moderno:

for i in *.jpg; do ((++j)); mkdir $(printf "%04d" $j) ; done
gniourf_gniourf
fonte
Isso é útil apenas para a criação de uma quantidade de diretórios conhecida anteriormente. Geralmente, ao usar diretórios numerados, você está dentro de um contexto dinâmico - o que significa que ele deve determinar a quantidade no tempo de execução e, portanto, ainda precisa de preenchimento de string. Depende do caso de uso específico, no entanto.
precisa saber é o seguinte
@FEichinger Right! post editado de acordo.
Gnourf_gniourf 19/12/12