2017-11-17 2 views
1

Ich habe den folgenden Befehl, den ich auf Kleinbuchstaben Dateien/Verzeichnisse ausführen, ersetzen. mit _ und verschiedenen anderen Manipulationen. Das Problem dabei ist, dass es versucht, die Verzeichnisse zuerst umzubenennen und dann die darunter liegenden Dateien nicht zu finden. Gibt es eine Möglichkeit, alle Dateien in einem Verzeichnis zuerst umzubenennen, dann das Verzeichnis selbst rekursiv? z.B.Linux Dateien vor den Verzeichnissen umbenennen

  • directory1
    • file1
    • file2
    • directory1
      • file1
      • file2
    • directory2
      • file1
  • directory2
    • file1
    • file2

Mein Code ist

Hier
while IFS= read -rd '' entry; do 
    entry="${entry#./}"   # strip ./ 
    if [[ -d $entry ]]; then 
     rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry" 
    else 
     rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry" 
    fi 
done < <(find . -iname '*' -print0) 
+0

Sie müssen Rekursion verwenden, um das in einer Aufnahme zu erreichen oder Dateien nur zuerst umzubenennen, dann die Verzeichnisse – dganesh2002

+1

Ich würde 'find' verwenden, um eine Liste zu erstellen und diese nach unten bezüglich Verzeichnis/Dateitiefe zu sortieren. – yacc

Antwort

0

ist Probe UNTESTED Code mit Rekursion:

recurse() 
{ 
for entry in "$1"/*; do 
    entry="${entry#./}"   # strip ./ 
    if [[ -d $entry ]]; then 
     recurse $entry 
     rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry" 
    else 
     rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry" 
    fi 
done 
} 

recurse "/home" 
0

Haben Sie sich bei this answer? Ihr Szenario ist komplizierter, aber es sieht aus wie sie mit der gleichen Schwierigkeit in Bezug auf die Rekursion zu tun hatten.

0

Ich war etwas entlang dieser Linie zu denken:

find /path |awk -F/ '{print NF,$0}' |sort -r -n -k 1 |cut -f2- -d' ' |\ 
    while IFS= read -rd '' entry; do 
    # ... 
    done 

Die Idee ist, jede Zeile mit der Anzahl der / voranstellen und sortieren in umgekehrter Richtung nach diesem Gebiet:

4/path/dir1/file1
4/path/dir2/file2
3/path/dir1
3/path/dir2
2/pat h

Dann schneiden Sie die erste Spalte weg. Auf diese Weise können Sie die Einträge von unten bearbeiten, um Probleme beim Umbenennen zu vermeiden.

+0

Das sieht so aus, als sollte es funktionieren, aber wenn ich versuche, die Dateien/Verzeichnisse zu verarbeiten, bekomme ich eine Fehlermeldung mit dem Titel 'Dateiname zu lang:'. Ich könnte hinzufügen, dass ich Bash für Windows (Ubuntu) verwende und den Befehl auf einem NTFS-Laufwerk ausführen, wenn das einen Unterschied macht. –

+0

Woher kommt es, benennen Sie es um? – yacc

+0

ja, ich denke schon, wenn ich das laufe, funktioniert es gut. | awk -F/'{print NF, $ 0}' | sortieren -r -n -k 1 | schneiden -f2- -d '' | \ entry = "$ {entry #. /}" # strip ./ wenn [[-d $ entry]]; dann echo $ Eintrag sonst echo $ Eintrag fi getan –

Verwandte Themen