Ich möchte für jeden Monat einen Verzeichnisnamen erstellen. Ich weiß nach einigem Spielen mit der Muschel, dass:
date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec
Also habe ich die Klammererweiterung verwendet echo {1..12}/01
und versucht xargs
:
echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b
Aber es scheitert kläglich: / (danach möchte ich mich bewerben mkdir
). Wie kann ich das machen?
shell-script
xargs
bash-expansion
JammingThebBits
quelle
quelle
ls
in alphabetischer Reihenfolge zu bearbeiten (April, August, Dezember, Februar, Januar, Juli, Juni, März, Mai, November, Oktober, September).mkdir january february [...]
? Sofern Sie sie nicht wirklich separat erstellen müssen, müssen Sie sie nicht so ausführen, wie Sie es vorgeschlagen haben.Antworten:
Mit
-I
,xargs
wird ein Argument pro Zeile auf die Standardeinstellung von einem Argumente im Gegensatz pro (leer oder Newline begrenzt, möglicherweise zitiert) Wort ohne-I
(und impliziert-n
). In Ihrem Beispieldate
wird also nur einmal aufgerufen{}
, wobei die gesamte Ausgabe vonecho
(die sich in einer Zeile befindet) abzüglich der nachfolgenden neuen Zeile erweitert wird.Hier können Sie Folgendes tun (beachten Sie, dass dies
-d
eine GNU-Erweiterung ist):(Beachten Sie, dass dies in Gebietsschemas, in denen Abkürzungen für Monatsnamen Leerzeichen oder Anführungszeichen enthalten, nicht ordnungsgemäß funktioniert. Mit GNU
xargs
können Sie dies mithilfe von umgehen.xargs -d '\n' mkdir --
)Um die Liste der Monatsabkürzungen in Ihrem Gebietsschema zu erhalten, ist es sinnvoller, das Gebietsschema direkt abzufragen:
(Siehe auch
locale -k LC_TIME
, um alle Gebietsschemadaten in derLC_TIME
Kategorie anzuzeigen ).Oder nativ in
zsh
:Zumindest auf GNU-Systemen werden in einigen Regionen die Monatsabkürzungen mit Leerzeichen auf eine feste Breite aufgefüllt:
Möglicherweise möchten Sie diese Polsterung entfernen.
Die führenden Leerzeichen würden von entfernt
xargs -I
, aber nicht die nachfolgenden. Mitzsh
:quelle
locale abmon
.IFS=';'; set -o noglob; mkdir -- $(locale abmon)
. ;)Versuchen Sie eine Schleife?
Wenn Sie für jeden Monat ein Verzeichnis erstellen möchten, würde ich Folgendes tun:
quelle
{1..12}
ein Bashismus ist. Verwenden Sie für eine POSIX-Shellfor m in $(seq 1 12)...
(obwohl beachten Sie, dassseq
selbst nicht von POSIX vorgeschrieben){1..12}
ein Zshismus, der später von ksh93, bash und mehreren anderen Shells kopiert wird.Versuchen Sie es in Shells mit Klammererweiterung und Datum, an dem die Eingabe von DATAFILE akzeptiert wird
und in die Schale leiten, wenn Sie mit dem Ergebnis zufrieden sind.
quelle
Ihr Befehl funktioniert nicht, da
-I
das Trennzeichen von xargs geändert wird:Sie können
-d " "
xargs hinzufügen , damit es funktioniert. Aber Sie brauchen-I{}
in Ihrem Fall nicht einmal :Versuche dies,
quelle
date
keinePOSIXLY_CORRECT
Variable in der Umgebung geben darf, damit Optionen nach solchen Nicht-Optionsargumenten akzeptiert werden .Du warst so nah dran.
Das Problem ist, dass Echo eine einzelne Zeile erzeugt
1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01
und dass xargs das Zeilenumbruchzeichen als Feldtrennzeichen verwendet (nicht das Leerzeichen).Die Lösung: Sagen Sie echo, dass zwischen jedem Feld ein Leerzeichen stehen soll.
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b
Ich habe nur
\\n
am Ende des Echos eingefügt .Dann, um die Verzeichnisse hinzuzufügen
|xargs mkdir
z.B
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir
quelle
Der einfachste und robusteste Weg, dies zu tun:
Es ist doch eine statische Liste von Monaten ...
Wenn Sie beabsichtigen, GNU zu verwenden
date
(hier unter der Annahme einer unveränderten$IFS
und GNU-date
ähnlichen für Siedate -d
):quelle