Problemas com o nome de base em um loop

1

Eu sou novo na programação shell script e estou tentando executar um software que lê um texto e executa a marcação de POS. Requer uma entrada e uma saída, como pode ser visto no exemplo de execução:

$ cat input.txt | /path/to/tagger/run-Tagger.sh > output.txt

O que eu estou tentando fazer é executar essa linha não apenas para um texto, mas um conjunto de textos em uma pasta específica, e retornar os arquivos de saída com o mesmo nome dos arquivos de entrada. Então, tentei fazer este script:

#!/bin/bash
path="/home/rafaeldaddio/Documents/"
program="/home/rafaeldaddio/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh"

for arqin in '/home/rafaeldaddio/Documents/teste/*'
do
out=$(basename $arqin)
output=$path$out
cat $arqin | $program > $output
done

Eu tentei com apenas um arquivo e funciona, mas quando tento com mais de um, recebo este erro:

basename: extra operand ‘/home/rafaeldaddio/Documents/teste/3’
Try 'basename --help' for more information.

./scriptLXTagger.sh: 12: ./scriptLXTagger.sh: cannot create /home/rafaeldaddio/Documents/: Is a directory

Alguma ideia sobre o que estou fazendo de errado? Obrigado.

    
por user2272708 23.06.2014 / 17:19

2 respostas

4

Você colocou aspas simples em torno de '/home/rafaeldaddio/Documents/teste/*' . Isso significa que ele está procurando por um único arquivo chamado * dentro de teste . (Duvido que você tenha tal arquivo, ou é isso que você pretendia!).

Isso significa que o loop for está sendo executado com uma única entrada e passando esse arquivo * para o nome base.

Em seguida, out=$(basename $arqin) está expandindo para out=$(basename file1 file2 file3 ... fileN) , o que é claro que muitos argumentos para o nome de base.

Solução simples: retire as aspas de /home/rafaeldaddio/Documents/teste/* .

    
por 23.06.2014 / 17:24
1

@BenXO já lhe disse por que isso falhou, mas você não precisa de um script para algo simples assim mesmo. Você pode simplesmente colar isso diretamente na linha de comando:

for arqin in /home/rafaeldaddio/Documents/teste/*; do 
    cat "$arqin" | 
      /home/rafaeldaddio/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh > \
        /home/rafaeldaddio/Documents/$(basename "$arqin"); 
done

Ou, como se cat foo | program funcionar, program foo quase certamente também funcionará e assumindo que /home/rafaeldaddio/ é seu diretório inicial, você pode simplificar para:

for arqin in ~/Documents/teste/*; do
 ~/Documents/LX-Tagger/POSTagger/Tagger/run-Tagger.sh "$arqin" > \
     ~/Documents/$(basename "$arqin");
done
    
por 23.06.2014 / 17:36