Erstellen Sie in einer Bash-Skriptschleife ein Verzeichnis mit dem Namen 0001 anstelle von 1

9

Wenn im folgenden Bash-Skript, wenn j = 0000, wie muss ich das folgende Bash-Skript ändern, um Verzeichnisse mit den Namen 0001, 0002, ... zu erstellen? Eigentlich macht es dirs mit den Namen 1, 2, 3

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

Vielen Dank!

Marcello
quelle

Antworten:

12

Ihr aktuelles Skript verwendet nur einen Dezimalwert - dies wird offensichtlich in den Wert ohne führende Nullen übersetzt.

Sie müssten die Zeichenfolge auf die Länge von 4 Zeichen mit führenden Nullen auffüllen. Verwenden Sie dazu Backticks ``, um das Ergebnis des printf-Aufrufs abzurufen printf %04d $j.

Daher sollten Sie den vollständigen Befehl haben:

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

Quelle: StackOverflow: bash - Auffüllen von Nullen in einer Zeichenfolge

(Natürlich finden Sie auch die weiteren Antworten auf diese Frage, wenn Sie eine eingehendere Lösung wünschen, aber dies funktioniert definitiv perfekt für diesen Anwendungsfall.)

user98085
quelle
4

Mit bash ist Ihre beste Option:

mkdir {0001..0666}

um dirs mit name 0001to zu erstellen 0666(mit null auffüllung).

Wenn Sie möchten , Verzeichnisse genannt prefix0001suffix, prefix0002suffix... dann:

mkdir prefix{0001..0666}suffix

Wird besorgt.

Wenn Sie nur Verzeichnisnamen mit ungeraden Nummern möchten

mkdir {0001..0666..2}

und so weiter ... Siehe Klammererweiterung im bashReferenzhandbuch .

Wie FEichinger betont, müssen Sie die Anzahl der Verzeichnisse im Voraus kennen. Wenn Sie eine Lösung suchen, die Ihrer nahe kommt, aber wirklich sicher ist und eine modernere Bash-Sprache verwendet:

for i in *.jpg; do ((++j)); mkdir $(printf "%04d" $j) ; done
gniourf_gniourf
quelle
Dies ist nur nützlich, wenn eine zuvor bekannte Anzahl von Verzeichnissen erstellt werden soll. Wenn Sie nummerierte Verzeichnisse verwenden, befinden Sie sich normalerweise in einem dynamischen Kontext. Dies bedeutet, dass der Betrag zur Laufzeit ermittelt werden sollte und daher weiterhin Zeichenfolgen aufgefüllt werden müssen. Hängt jedoch vom spezifischen Anwendungsfall ab.
user98085
@ FEichinger Richtig! Beitrag entsprechend bearbeitet.
gniourf_gniourf