Podemos usar a abordagem clássica: find
com while read
combo:
Demo:
$ ls *
fred:
results.txt
jane:
results.txt
john:
results.txt
$> find . -type f -name "results.txt" -printf "/%P\n" | 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
Use echo
antes de usar mv
para testar a linha com seus arquivos.
Menor melhoria
Podemos incorporar a chamada a bash
em exec, com expansão de parâmetro (especificamente, remoção de prefixo). Basicamente, ele está incorporando um script na chamada 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
Para tornar o comando geral, (trabalhando para qualquer arquivo, não apenas results.txt
), basta remover -name "results.txt"
part. Veja também esta postagem para uma solução alternativa em Python.