Проблемы с basename в цикле

Я новичок в программировании скриптов оболочки, и я пытаюсь выполнить программное обеспечение, которое читает текст и выполняет его маркировку 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 

Любые идеи о том, что я делаю неправильно? Благодарю.

2 Solutions collect form web for “Проблемы с basename в цикле”

Вы поставили одинарные кавычки вокруг '/home/rafaeldaddio/Documents/teste/*' . Это означает, что он ищет один файл с именем * внутри teste . (Я сомневаюсь, что у вас есть такой файл, или это то, что вы намеревались!).

Это означает, что цикл for работает с одной записью и передает этот файл * в basename.

Затем out=$(basename $arqin) расширяется до out=$(basename file1 file2 file3 ... fileN) который, конечно, слишком много аргументов для basename.

Простое решение: /home/rafaeldaddio/Documents/teste/* цитаты подальше от /home/rafaeldaddio/Documents/teste/* .

@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 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 
  • Как я могу увеличить число, найденное подстановочным знаком в предыдущей команде? (ЗШ)
  • Есть ли LC_COLLATE, который сортирует точку перед тире?
  • Найти файлы, имя которых составляет 4 символа
  • Создание скрипта, который запускает простую команду для всех файлов в каталоге
  • Формирование новых строк с печатью подстановок кошки
  • Использовать все хосты, завершенные zsh для cssh
  • Удалять файлы с одинаковым именем в конце файла
  • Разница между find ~ и find *
  • Каталог Untar из большого tarball
  • Получите дополнение к результату команды ls
  • Удалить неизвестный символ юникода из textfiles - sed, другие методы bash / shell
  • Linux и Unix - лучшая ОС в мире.