루프의 기본 이름 문제

루프의 기본 이름 문제

저는 쉘 스크립팅을 처음 접했고 텍스트를 읽고 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루프가 단일 항목으로 실행되고 파일에 *기본 이름을 전달한다는 의미입니다.

그런 다음 out=$(basename $arqin)확장하면 out=$(basename file1 file2 file3 ... fileN)물론 basename에 대한 매개변수가 너무 많습니다.

간단한 해결책: 주위의 따옴표를 제거하십시오 /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

관련 정보