Probleme mit dem Basisnamen in einer Schleife

Probleme mit dem Basisnamen in einer Schleife

Ich bin neu in der Shell-Skript-Programmierung und versuche, eine Software auszuführen, die einen Text liest und dessen POS-Tagging durchführt. Dazu sind eine Eingabe und eine Ausgabe erforderlich, wie im Ausführungsbeispiel zu sehen ist:

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

Ich versuche, diese Zeile nicht nur für einen Text, sondern für eine Reihe von Texten in einem bestimmten Ordner auszuführen und die Ausgabedateien mit demselben Namen wie die Eingabedateien zurückzugeben. Also habe ich versucht, dieses Skript auszuführen:

#!/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

Ich habe es nur mit einer Datei versucht und es funktioniert, aber wenn ich es mit mehr als einer versuche, erhalte ich diese Fehlermeldung:

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

Irgendwelche Erkenntnisse darüber, was ich falsch mache? Danke.

Antwort1

Sie haben einfache Anführungszeichen um gesetzt . Das bedeutet, dass nach einer einzelnen Datei mit dem Namen '/home/rafaeldaddio/Documents/teste/*'gesucht wird . (Ich bezweifle, dass Sie eine solche Datei haben oder dass Sie das beabsichtigt haben!).*teste

Dies bedeutet, dass Ihre forSchleife mit einem einzelnen Eintrag ausgeführt wird und diese Datei *an den Basisnamen übergibt.

Dann out=$(basename $arqin)erfolgt eine Erweiterung, out=$(basename file1 file2 file3 ... fileN)was natürlich zu viele Argumente für den Basisnamen sind.

Einfache Lösung: Entfernen Sie die Anführungszeichen rund um /home/rafaeldaddio/Documents/teste/*.

Antwort2

@BenXO hat dir bereits erklärt, warum das fehlgeschlagen ist, aber für so etwas Einfaches brauchst du ohnehin kein Skript. Du könntest das hier einfach direkt in die Befehlszeile einfügen:

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

Oder, da „wenn cat foo | programes funktioniert“ program foomit ziemlicher Sicherheit auch funktioniert und Sie davon ausgehen, dass es /home/rafaeldaddio/sich um Ihr Home-Verzeichnis handelt, können Sie es wie folgt vereinfachen:

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

verwandte Informationen