Ich muss mit einer großen Anzahl von Dateien umgehen, die in Verzeichnissen verschachtelt sind (eine Datei pro Verzeichnis), die etwa so aussehen:
fred/result.txt
john/result.txt
mary/result.txt
...
Ich verwende derzeit den folgenden Befehl, um jede dieser Dateien zu verarbeiten:
find . -maxdepth 1 -type d ( ! -name . ) -exec bash -c "cd '{}' && processResult result.txt" ;
Ich suche nach etwas, das ich am Ende dieses Befehls hinzufügen kann, um die Dateinamen in fred.txt
zu ändern usw. und verschieben Sie die Datei später in das übergeordnete Verzeichnis, um die zusätzliche Ebene von Verzeichnissen zu beseitigen.
Was wäre der beste Weg, dies zu tun?
Akzeptierte Antwort:
Wir können den klassischen Ansatz verwenden:find
mit while read
Kombination:
Demo:
$ ls *
fred:
results.txt
jane:
results.txt
john:
results.txt
$> find . -type f -name "results.txt" -printf "/%Pn" | while read FILE ; do DIR=$(dirname "$FILE" );
> mv ."$FILE" ."$DIR""$DIR".txt;done
$> ls
fred/ jane/ john/
$> ls *
fred:
fred.txt
jane:
jane.txt
john:
john.txt
Verwenden Sie echo
bevor Sie mv
verwenden um die Zeile mit Ihren Dateien zu testen.
Kleine Verbesserung
Wir können den Aufruf von bash
einbetten in exec , mit Parametererweiterung (insbesondere Präfixentfernung). Im Grunde ist es das Einbetten eines Skripts in den Exec-Aufruf.
$> find "$PWD" -type f -name "results.txt" -exec bash -c ' DIR=$( dirname "{}" ); echo "{}" "$DIR"/"${DIR##*/}".txt ' ;
/home/xieerqi/TESTDIR/fred/results.txt /home/xieerqi/TESTDIR/fred/fred.txt
/home/xieerqi/TESTDIR/jane/results.txt /home/xieerqi/TESTDIR/jane/jane.txt
/home/xieerqi/TESTDIR/john/results.txt /home/xieerqi/TESTDIR/john/john.txt
Um den Befehl allgemein zu machen (funktioniert für jede Datei, nicht nur results.txt
) entfernen Sie einfach -name "results.txt"
Teil. Siehe auch diesen Beitrag für alternative Python-Lösungen dazu.