GNU/Linux >> Znalost Linux >  >> Ubuntu

Přejmenovat soubor na název nadřazeného adresáře v terminálu?

Musím se vypořádat s velkým počtem souborů vnořených uvnitř adresářů (jeden soubor na adresář), které se podobají něčemu takovému:

fred/result.txt
john/result.txt
mary/result.txt
...

Ke zpracování každého z těchto souborů aktuálně používám následující příkaz:

find . -maxdepth 1 -type d ( ! -name . ) -exec bash -c "cd '{}' && processResult result.txt" ;

Hledám něco, co bych mohl přidat na konec tohoto příkazu, který změní názvy souborů na fred.txt , atd. a později přesunout soubor do nadřazeného adresáře, aby se odstranila další vrstva adresářů.

Jaký by byl nejlepší způsob, jak to udělat?

Přijatá odpověď:

Můžeme použít klasický přístup:find s while read kombinace:

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

Použijte echo před použitím mv otestovat řádek s vašimi soubory.

Drobné vylepšení

Můžeme vložit volání do bash do exec , s rozšířením parametrů (konkrétně odstranění prefixu). V podstatě je to vložení skriptu do volání exec.

$> 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

Aby byl příkaz obecný, (funguje pro jakýkoli soubor, nejen pro results.txt ) stačí odstranit -name "results.txt" část. Podívejte se také na tento příspěvek pro alternativní řešení Pythonu.


Ubuntu
  1. Uložit veškerý výstup z terminálu do souboru?

  2. Pro smyčku s názvy souborů?

  3. Jak přejmenovat doménu

  1. Jak přejmenovat soubor v Linuxu?

  2. Linuxový shell skript pro přidání úvodních nul k názvům souborů

  3. wget:název staženého souboru

  1. Zapsat do souboru .txt?

  2. Přesunutí souboru v Linuxu v C

  3. Linux mv soubor s dlouhým názvem