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