Crea una directory chiamata 0001 anziché 1 in un ciclo di script bash


10

Nel seguente script bash se j = 0000 come devo cambiare il seguente script bash per creare le directory chiamate 0001, 0002, ...? In realtà crea dirs chiamati 1, 2, 3

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

Grazie!

Risposte:


13

Lo script corrente utilizza solo un valore decimale - questo ovviamente si traduce nel valore senza zeri iniziali.

Dovresti riempire la stringa con una lunghezza di 4 caratteri, con zeri iniziali. A tale scopo, utilizzare i backtick ``per ottenere il risultato della chiamata printf printf %04d $j.

Di conseguenza, dovresti avere il comando completo:

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

Fonte: StackOverflow: bash - Riempi gli zeri in una stringa

(Ovviamente vedi anche le ulteriori risposte a questa domanda, se vuoi una soluzione più approfondita, ma questo sicuramente funziona perfettamente per questo caso d'uso.)


5

Usando bash, l'opzione migliore è:

mkdir {0001..0666}

per creare dir con nome 0001a 0666(con zero padding).

Se si desidera che le directory di nome prefix0001suffix, prefix0002suffix... allora:

mkdir prefix{0001..0666}suffix

andrà bene.

Se vuoi solo nomi di directory con numeri dispari

mkdir {0001..0666..2}

e così via ... Vedi Brace Expansion nel bashmanuale di riferimento .

Come sottolinea FEichinger, è necessario conoscere in anticipo il numero di directory. Se vuoi una soluzione vicina alla tua, ma davvero sicura e usando un linguaggio bash più moderno:

for i in *.jpg; do ((++j)); mkdir $(printf "%04d" $j) ; done

Ciò è utile solo per la creazione di una quantità di directory precedentemente nota. Di solito, quando si utilizzano directory numerate, ci si trova in un contesto dinamico, il che significa che dovrebbe determinare la quantità in fase di runtime e quindi necessita ancora del riempimento di stringhe. Tuttavia, dipende dal caso d'uso specifico.
user98085

@FEichinger Giusto! post modificato di conseguenza.
gniourf_gniourf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.