le code suivant ne fonctionne pas à cause des espaces dans les noms de fichier, comment corriger?
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
Il suffit d'utiliser la substitution de commande: utilisez for name in *
.
Remplacer
[.____] Pour ce nom dans `ls`
avec:
[.____] LS | En lisant le nom
Avis: La variable Bash est affreuse. Si vous modifiez une variable à l'intérieur de la boucle, cela ne prendra pas effet en dehors de la boucle (dans ma version, vous ne le ferez pas, dans votre version. Dans cet exemple, peu importe.
Avis 2: Cela fonctionne pour les noms de fichiers avec des espaces, mais échoue à un autre nom de fichier étrange mais valide. Voir le commentaire de Charles Duffy ci-dessous.
On dirait deux problèmes potentiels:
Premièrement, la variable IFS et la mission ne devraient pas avoir de place en eux. À la place de
IFS = '\n'
ça devrait être IFS=$'\n'
Deuxièmement, for name in ls
causera des problèmes avec le nom de fichier ayant spaces
et newlines
. Si vous souhaitez simplement gérer filename
avec spaces
alors faites quelque chose comme ça
for name in *
Je ne comprends pas la signification de la ligne
number=`echo "$name" | grep -o "[0-9]\{1,2\}"`
Cela vous donnera des chiffres trouvés dans filename with spaces
dans new lines
. Peut-être que c'est ce que tu veux.