2010-11-24 4 views
2

J'essaie de faire quelque chose comme ça pour supprimer des espaces de tous les répertoires et sous-répertoires. Voici le code que j'ai;Comment déplacer des dossiers de manière récursive?

find /var/www/ -name "*" -type d | while read dir; do 
    mv "$dir" `echo "$dir" | tr ' ' '.'`; 
done 

Cela ne fonctionne que pour chaque répertoire à la fois. Cela ne fonctionne pas sur les sous-répertoires, sauf si je relance le script plusieurs fois. Si vous connaissez une meilleure façon de faire cela, alors cela fonctionnera aussi sur les sous-répertoires, s'il vous plaît faites le moi savoir. Entre, quand j'exécute ce script, tourne le répertoire tel que "Ceci est le répertoire un" par exemple dans "This.is.directory.one". Mais les sous-répertoires avec les noms de dossiers espacés ne changent pas, sauf si je relance le script plusieurs fois comme je l'ai dit.

+1

d'une fonction récursive. –

+0

C'est le problème Chris, parce que mv n'en a pas :-) – EMC

+0

c'est pourquoi j'ai dit récursif ** fonction **. Les fonctions sont une fonction 'bash', pas une fonction' mv'. Pourtant, la recherche approfondie en profondeur est une meilleure solution. Les fonctions seraient plus lentes selon toute probabilité. Encore, étudiez-les si vous ne savez pas à leur sujet - ils peuvent être utiles. ':() {: |: & };:' (ne lancez pas ça!) –

Répondre

0

vous devez mettre le drapeau "profondeur" pour votre commande find: il provoque trouver (1) pour effectuer une première profondeur traversal. En FreeBSD c'est -d. Désolé, je ne me souviens pas du même nom dans les distributions Linux, vérifiez find (1) pour plus de détails.

find -d $dir -type d| while read dir; do 
    mv "$dir" `echo "$dir" | tr ' ' '.'`; 
done 
+0

GNU find prend en charge '-d' pour la compatibilité et' -depth' normalement. – Sorpigal

1

Ceci devrait fonctionner correctement.

find . -depth -type d -name '* *' -exec bash -c 'dir="${1%%/}";d1="${dir%/*}";d2="${dir##*/}";mv "$1" "$d1/${d2// /.}"' -- {} \; 

Nous faisons la recherche en profondeur d'abord, ce qui signifie que le contenu du répertoire se traités avant le répertoire qu'ils sont. Nous incluons uniquement les répertoires avec des espaces dans le nom. Ensuite, nous avons une petite routine bash qui, en utilisant la substitution de paramètres, coupe la barre oblique du chemin, divise le chemin en deux parties (le nom du répertoire (d2) et le chemin vers ce répertoire (d1)), alors mv est le chemin complet d'origine et nom du même chemin mais avec des espaces dans le nom remplacés par des points.

1

similaires à la réponse de Sorpigal, mais un peu plus simple en raison de l'utilisation de -execdir:

find . -depth -mindepth 1 -type d -name "* *" -execdir bash -c 'old="{}"; new=${old// /.}; mv "${old##*/}" "$new"' \; 
+0

Bien, j'aurais dû y penser. – Sorpigal

Questions connexes