Je voudrais créer un nom de répertoire pour chaque mois. Je sais, après avoir joué avec la coque, que:
date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec
J'ai donc utilisé l'expansion d'accolade, echo {1..12}/01
et j'ai essayé xargs
:
echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b
Mais cela échoue lamentablement: / (après j'aimerais postuler mkdir
). Comment puis-je faire ceci?
shell-script
xargs
bash-expansion
JammingThebBits
la source
la source
ls
éditer par ordre alphabétique (avril, août, décembre, février, janvier, juillet, juin, mars, mai, novembre, octobre, septembre).mkdir january february [...]
? Sauf si vous devez vraiment les créer séparément, il n'est pas nécessaire de le faire comme vous l'avez suggéré.Réponses:
Avec
-I
,xargs
obtient un argument par ligne par opposition à la valeur par défaut d'un argument par mot (vide ou délimité par une nouvelle ligne, éventuellement cité) sans-I
(et implique-n
). Ainsi, dans votre exemple,date
est appelé une seule fois avec{}
étendu à la sortie entière deecho
(qui se trouve sur une seule ligne), moins la nouvelle ligne de fin.Ici, vous pouvez le faire (notez qu'il
-d
s'agit d'une extension GNU):(notez que cela ne fonctionnera pas correctement dans les environnements locaux où les abréviations de nom de mois contiennent des espaces ou des guillemets; avec GNU
xargs
, vous pouvez contourner cela en utilisantxargs -d '\n' mkdir --
)Maintenant, pour obtenir la liste des abréviations de mois dans vos paramètres régionaux, interroger directement les paramètres régionaux aurait plus de sens:
(voir aussi
locale -k LC_TIME
pour voir toutes les données locales dans laLC_TIME
catégorie).Ou nativement dans
zsh
:Au moins sur les systèmes GNU, dans certaines régions, les abréviations des mois sont complétées à une largeur fixe avec des espaces:
Vous souhaiterez peut-être supprimer ce rembourrage.
Les espaces en tête seraient supprimés par
xargs -I
, mais pas ceux en queue. Aveczsh
:la source
locale abmon
.IFS=';'; set -o noglob; mkdir -- $(locale abmon)
. ;)Essayez une boucle?
Si vous voulez faire un annuaire pour chaque mois, je ferais quelque chose comme:
la source
{1..12}
c'est un bashisme. Pour un shell POSIX, utilisezfor m in $(seq 1 12)...
(mais notez queseq
lui - même n'est pas mandaté par POSIX){1..12}
est un zshisme, copié plus tard par ksh93, bash et plusieurs autres obus.Dans les shells avec extension d'accolade et date acceptant l'entrée DATAFILE, essayez
et canalisez dans la coquille si vous êtes satisfait du résultat.
la source
Votre commande ne fonctionne pas, en raison de l'utilisation de
-I
modifications du délimiteur de xargs:Vous pouvez ajouter
-d " "
à xargs pour le faire fonctionner. Mais vous n'avez même pas besoin-I{}
dans votre cas:Essaye ça,
la source
date
accepte des options après des arguments sans option comme ça, il ne doit pas y avoir dePOSIXLY_CORRECT
variable dans l'environnement.Vous étiez si proche.
Le problème est que l'écho produit une seule ligne
1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01
et que xargs utilise le caractère de nouvelle ligne comme séparateur de champ (pas l'espace).La solution: dites à écho de mettre un espace entre chaque champ.
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b
Je n'ai inséré
\\n
qu'à la fin de l'écho.Ensuite, pour ajouter les répertoires
|xargs mkdir
par exemple
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir
la source
La façon la plus simple et la plus robuste de le faire:
C'est une liste statique de mois après tout ...
Si vous avez l'intention d'utiliser GNU
date
(en supposant ici un$IFS
GNU non modifié etdate
similaire au vôtredate -d
):la source