pour le nom de `ls` et les noms de fichiers avec des espaces
code suivant ne fonctionne pas à cause des espaces dans les noms de fichier, Comment réparer?
IFS = '\n'
for name in `ls `
do
number=`echo "$name" | grep -o "[0-9]\{1,2\}"`
if [[ ! -z "$number" ]]; then
mv "$name" "./$number"
fi
done
Vous devez vous connecter pour publier un commentaire.
Il suffit de ne pas utiliser la substitution de commande: utiliser
for name in *
.name="*"
. Pas un problème dans ce cas particulier, cependant.shopt -s nullglob
va provoquer*
de l'étendre à zéro des mots, s'il n'y a pas de matches.| sort
ou| shuf
, l'utilisation d'expansion" avis semble assez inutile.Remplacer
avec:
Avis: bash variable de la portée est terrible. Si vous modifiez une variable à l'intérieur de la boucle, il ne prendra pas effet à l'extérieur de la boucle (dans ma version il n'est pas, dans votre version il sera). Dans cet exemple, il n'a pas d'importance.
Avis 2: Cela fonctionne pour les noms de fichiers avec des espaces, mais échoue pour une autre étrange, mais des noms de fichier valide. Voir Charles Duffy commentaire ci-dessous.
ls | while read name
est faux. Il ne gère pas correctement les noms de fichiers avec littérale des barres obliques inverses, ou les noms de fichiers avec littérale des retours à la ligne, ou des noms de fichier avec des espaces avant ni après.foo | bar
signifie "exécuter un sous-processus foo, et un sous-processus de la barre, avec la sortie de la première sous-processus relié à l'entrée de la deuxième sous-processus". Depuis il se passe des choses dans les sous-processus, de cours ils ne peuvent pas l'impact du processus parent de variables ou de l'état. (Ci-dessus est en fait pas tout true -- POSIX sh norme ne spécifie pas que tous les composants de pipeline doit être sous-processus-mais c'est une bonne première approximation).lastpipe
option introduite dans la version 4.2 est activée et que certaines autres conditions sont remplies; ksh exécute le dernier composant d'un pipeline dans le parent de la coquille, et met tous les autres dans les sous-processus; d'autres implémentations de la norme peut varier plus loin).Ressemble deux problèmes potentiels:
Tout d'abord, la variable IFS et c'est d'affectation ne devrait pas avoir d'espace. Au lieu de
IFS = '\n'
il devrait êtreIFS=$'\n'
Deuxièmement,
for name in ls
va provoquer des problèmes avec le nom de fichier ayantspaces
etnewlines
. Si vous souhaitez gérerfilename
avecspaces
de faire quelque chose comme cecifor name in *
Je ne comprends pas la signification de la ligne
Cela vous donnera des numéros qui se trouvent dans
filename with spaces
dansnew lines
. Peut-être que c'est ce que vous voulez.IFS=$'\n'
- sans le$
,\n
n'est pas interprété comme un retour à la ligne, mais comme un antislash et la lettre "n".