Problemas con el nombre base en un bucle

Problemas con el nombre base en un bucle

Soy nuevo en la programación de scripts de shell y estoy intentando ejecutar un software que lee un texto y realiza su etiquetado POS. Requiere una entrada y una salida, como se puede ver en el ejemplo de ejecución:

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

Lo que intento hacer es ejecutar esta línea no solo para un texto, sino para un conjunto de textos en una carpeta específica, y devolver los archivos de salida con el mismo nombre que los archivos de entrada. Entonces, intenté hacer 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

Lo probé con un solo archivo y funciona, pero cuando intento con más de uno, aparece este error:

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

¿Alguna idea sobre lo que estoy haciendo mal? Gracias.

Respuesta1

Has puesto comillas simples '/home/rafaeldaddio/Documents/teste/*'. Esto significa que está buscando un único archivo llamado *inside teste. (¡Dudo que tengas ese archivo, o que eso sea lo que pretendías!).

Esto significa que su forbucle se ejecuta con una sola entrada y pasa ese archivo *al nombre base.

Luego, out=$(basename $arqin)se está expandiendo a out=$(basename file1 file2 file3 ... fileN)lo cual, por supuesto, hay demasiados argumentos para el nombre base.

Solución sencilla: quitar las comillas de alrededor /home/rafaeldaddio/Documents/teste/*.

Respuesta2

@BenXO ya te dijo por qué falló, pero de todos modos no necesitas un script para algo tan simple. Podrías pegar esto directamente en la línea 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

O, dado que si cat foo | programfunciona, program fooes casi seguro que también funciona y, suponiendo que ese /home/rafaeldaddio/sea su directorio de inicio, puede simplificar a:

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

información relacionada