루프의 기본 이름 문제

루프의 기본 이름 문제

저는 쉘 스크립트 프로그래밍을 처음 접했고 텍스트를 읽고 POS 태깅을 수행하는 소프트웨어를 실행하려고 합니다. 실행 예제에서 볼 수 있듯이 입력과 출력이 필요합니다.

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

내가 하려는 것은 텍스트뿐만 아니라 특정 폴더에 있는 텍스트 집합에 대해서도 이 줄을 실행하고 입력 파일과 동일한 이름을 가진 출력 파일을 반환하는 것입니다. 그래서 저는 다음 스크립트를 작성해 보았습니다.

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

하나의 파일로만 시도했는데 작동했지만, 두 개 이상의 파일로 시도하면 다음 오류가 발생합니다.

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

내가 뭘 잘못하고 있는지에 대한 통찰력이 있습니까? 감사해요.

답변1

주위에 작은따옴표를 넣었습니다 '/home/rafaeldaddio/Documents/teste/*'. 이는 *inside 라는 단일 파일을 찾고 있음을 의미합니다 teste. (나는 당신이 그런 파일을 가지고 있는지 의심스럽습니다. 아니면 그것이 당신이 의도한 것입니다!).

이는 for루프가 단일 항목으로 실행되고 해당 파일을 *basename에 전달한다는 의미입니다.

그런 다음 기본 이름에 대한 인수가 너무 많은 out=$(basename $arqin)확장 입니다.out=$(basename file1 file2 file3 ... fileN)

간단한 해결책: 주변에서 따옴표를 떼어냅니다 /home/rafaeldaddio/Documents/teste/*.

답변2

@BenXO는 이미 실패한 이유를 설명했지만 어쨌든 이렇게 간단한 작업에는 스크립트가 실제로 필요하지 않습니다. 다음을 명령줄에 직접 붙여넣을 수 있습니다.

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

또는 cat foo | program작동 하면 program foo거의 확실히 작동하고 그것이 /home/rafaeldaddio/홈 디렉토리라고 가정하면 다음과 같이 단순화할 수 있습니다.

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

관련 정보