2016-07-14 11 views
-1

Ich schreibe ein Unix-Shell-Skript, das Daten in zehn Unterverzeichnissen (mit der Bezeichnung 1-10) des Basisverzeichnisses sortiert. In jedem Unterverzeichnis muss das Skript die Dateien hehd.output und fort.hehd.time umbenennen sowie die Datei hehd.data in eine .data-Datei mit einem neuen Namen kopieren.Benennen einer Datei mit einer Variablen in einem Shell-Skript

Was Ich mag würde es zu tun ist, jede dieser Dateien in folgendem Format umbenennen:

AA.BB.CC

Wo

AA = a variable in the hehd.data file within the subdirectory containing the file 
    BB = the name of the subdirectory containing the file (1-10) 
    CC = the original file name 

Jedes Unterverzeichnis ein hehd enthält. Datendatei, und jede hehd.data-Datei enthält die Zeichenfolge ij0 = AA, wobei AA die Variable darstellt, die ich verwenden möchte, um die Dateien in demselben Unterverzeichnis umzubenennen.

Zum Beispiel: Wenn er gestartet wird, sollte das Skript /home/4/hehd.data für die Zeichenfolge suchen ij0 = 2, dann bewegen /home/4/hehd.output /home/4/2.4.hehd .Ausgabe.

Ich verwende derzeit den Befehl grep, um das Skript nach der Zeichenfolge ij0 = * suchen zu lassen und es in eine neue Textdatei innerhalb des Unterverzeichnisses zu kopieren. Als nächstes wird die Zeichenkette ij0 = aus der Textdatei gelöscht, und dann wird ihr Inhalt verwendet, um alle Zieldateien in demselben Unterverzeichnis umzubenennen. Die letzte Zeile des Shell-Skripts löscht die Textdatei.

Ich suche nach einem besseren Weg, dies zu erreichen, vorzugsweise so, dass alle zehn Unterverzeichnisse auf einmal durch das gleiche Skript sortiert werden können. Mein Skript scheint unglaublich ineffizient zu sein und tut nicht alles, was ich will.

Wie kann ich das verbessern?

Alle Ratschläge oder Vorschläge würden geschätzt werden; Ich versuche, ein besserer Computerbenutzer zu werden, und das bedeutet, bessere Methoden zu lernen, Dinge zu tun.

+1

Bitte beachten Sie, dass Sie tatsächlichen Code zur Verfügung stellen, im Gegensatz zu nur englischem Pseudocode. Implementierungsdetails sind wichtig, und wir können nicht sehen, was sie sind, ohne die Implementierung zu lesen. –

+1

(Im Allgemeinen gibt es in StackOverflow eine Präferenz für gezielte Fragen mit bestimmten Antworten; offene Fragen, die als "Können wir über X diskutieren?" Sind hier nicht ganz willkommen, im Gegensatz zu einer Frage "Wie? kann ich Problem X beheben? "das hat eine konkrete Lösung; für allgemeine Zwecke" wie kann ich diesen bereits funktionierenden Code verbessern? "Fragen, siehe http: //codereview.stackexchange.com/- aber lesen Sie die Site-Regeln dort, anstatt nur neu zu buchen). –

+1

... http://stackoverflow.com/help/dont-ask deckt ein ähnliches Gebiet ab. –

Antwort

0

Try this:

fromdir=/home 
for i in {1..10};do 
    AA=$(sed 's/ij0=\([0-9]*\)/\1/' "$fromdir/$i/hehd.data") 
    BB="$i" 
    for f in "$fromdir/$i/"*;do 
    CC="${f##*/}" 
    if [[ "$CC" = "hehd.data" ]]; then 
     echo cp "$f" "$fromdir/$i/$AA.$BB.$CC" 
    else 
     echo mv "$f" "$fromdir/$i/$AA.$BB.$CC" 
    fi 
    done 
done 

Es Schleifen über Verzeichnisse Bash Sequenz {1..10] verwenden.

In jedem Verzeichnis wird mit dem Befehl sed der Wert ij0 der Variablen AA zugewiesen, der Verzeichnisname wird BB10 zugewiesen.

In der Dateischleife wird die Datei hehd.data kopiert, ansonsten wird sie mit dem neuen Namen umbenannt.

Sie können die echo vor cp und mv Befehle entfernen, wenn die Ausgabe Ihren Anforderungen entspricht.

+0

Ohne den OP, der seinen Code veröffentlicht, könnten Sie mit demselben Code enden, den er bereits geschrieben hat. – alvits

+0

@alvits Er gibt eine kurze Beschreibung seines Ansatzes (create-Datei von 'grep' Ausgabe, löschen Variablennamen aus der Datei löschen Datei), ist nicht meine. Lassen Sie uns abwarten. – SLePort

Verwandte Themen