GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Eine Datei im Terminal in den Namen des übergeordneten Verzeichnisses umbenennen?

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.


Ubuntu
  1. Ist Mv Atomic auf den Fs?

  2. Bash-Datei Massenumbenennung mit Zähler?

  3. Befehl zum Anzeigen von Mediendateiinformationen im Terminal?

  4. For-Schleife mit Dateinamen?

  5. So benennen Sie eine Domäne um

Benennen Sie eine Datei im Linux-Terminal um

So installieren Sie den Ranger Terminal File Manager unter Linux

So erstellen Sie eine Datei in Linux mit Terminal

So benennen Sie Dateien in Ubuntu 20.04 um

Terminal-Pager

Linux-mv-Datei mit langem Namen