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.