Problemas com basename em um loop

Problemas com basename em um loop

Sou novo em programação de shell script e estou tentando executar um software que lê um texto e realiza sua marcação de PDV. 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 estou tentando fazer é executar esta linha não apenas para um texto, mas para 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

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 do que estou fazendo de errado? Obrigado.

Responder1

Você colocou aspas simples '/home/rafaeldaddio/Documents/teste/*'. Isso significa que ele está procurando por um único arquivo chamado *inside teste. (Duvido que você tenha esse arquivo ou seja isso que você pretendia!).

Isso significa que seu forloop está sendo executado com uma única entrada e passando esse arquivo *para basename.

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

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

Responder2

@BenXO já lhe disse por que isso falhou, mas você realmente não precisa de um script para algo tão simples. Você poderia 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 cat foo | programfunciona, program fooquase certamente também funciona e assumindo que esse /home/rafaeldaddio/é o seu diretório pessoal, você pode simplificar para:

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

informação relacionada