2017-03-31 3 views
1

Ich habe den folgenden Befehl, der rekursiv alle Dateien/Verzeichnisse in Kleinbuchstaben umbenannt und Leerzeichen durch _ ersetzt.Linux rekursiv Perioden für alle Verzeichnisse und alle außer letzte Periode für Dateien mit Unterstrichen ersetzen

Wie kann ich es erweitern, um alle Perioden aus den Verzeichnissen zu entfernen und nur die letzte Periode für Dateien zu lassen?

So würde eingegeben werden: this.is.a.directory this.is.a.file.txt

Ausgabe this_is_a_directory this_is_a_file.txt

Antwort

0

Sie können diese mit find in ein tun while-Schleife und eine regex letzten DOT für Dateien verlassen:

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

s/\.(?=.*\.)/_/g wird nur Ersetze einen DOT, wenn ein weiterer DOT in der Eingabe vorhanden ist.

+0

Wenn ich den obigen Befehl ausführen, wird ein Fehler ausgelöst - Kann nicht umbenennen ./this.is.a.test _/this_is_a.test: Keine solche Datei oder Verzeichnis. Irgendwelche Ideen, warum es diesen Fehler wirft? –

+0

Ich denke das ist weil '. /' Am Anfang. Probiere mein bearbeitetes Skript jetzt aus. – anubhava

+1

funktioniert jetzt wie ein Traum danke –

Verwandte Themen