loop dentro de caminhos de vários níveis e renomeie

0

Supondo que eu tenha um arquivo chamado list.txt contém caminhos para arquivos dentro de um diretório;

E o padrão dos caminhos é assim:

./path/to/file.txt
./path/to/another/file.txt
... etc

Eu quero fazer um loop dentro do arquivo list.txt para obter os caminhos dos arquivos e alterar sua codificação usando iconv ;

Eu estava fazendo isso se tudo estivesse no mesmo diretório, usando:

for i in 'cat list.txt' ; do iconv -f windows-1256 -t utf8 $i > new_$i; done

Mas o problema que estou enfrentando agora é, já que são caminhos de vários níveis, nomear a saída de iconv imprime o new_$i no início de o caminho - eu acho - e isso me dá erros:

No such file or directory

Então, como posso fazer com que o outpot de iconv seja:

./path/to/new_file.txt
./path/to/another/new_file.txt
... etc
    
por Homer 28.07.2016 / 20:58

1 resposta

1

Você poderia usar algo assim, se estiver usando bash como seu shell:

while read name
do dir="${name%/*}" file="${name##*/}"
iconv -f windows-1256 -t utf8 "$dir/$file" -o "$dir/new_$file"
done  < list.txt

A linha que atribui dir e file usa construções documentadas na parte Parameter expansion da seção EXPANSION da página bash man. As marcas de aspas em torno das construções destinam-se a manipular espaços em branco em nomes de arquivos.

Se você quiser testar algo assim antes de usá-lo, você pode prefixar echo no comando de interesse ( iconv neste exemplo) para ter certeza de que o comando é o que você pretende que seja.

    
por 28.07.2016 / 22:01