web-dev-qa-db-fra.com

Pour nom dans `ls` et noms de fichiers avec des espaces

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
25
Yola

Il suffit d'utiliser la substitution de commande: utilisez for name in *.

32
fge

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.

17
ugoren

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.

3
jaypal singh