저는 쉘 스크립트 프로그래밍을 처음 접했고 텍스트를 읽고 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