![Problemas com basename em um loop](https://rvso.com/image/38675/Problemas%20com%20basename%20em%20um%20loop.png)
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 for
loop 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 | program
funciona, program foo
quase 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