Проблемы с 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 
  • Удалять файлы с одинаковым именем в конце файла
  • Использование шаблона в команде «ls» для поиска файлов, содержащих только прописные буквы
  • Есть ли LC_COLLATE, который сортирует точку перед тире?
  • aptitude remove pkg_name * не работает как apt-get
  • Как избавиться от «Ничего не найдено» при запуске «rm *»
  • Я случайно скопировал часть каталога / * to / some /, как мне исправить мою ошибку?
  • Список файлов в иерархии каталога
  • Почему соответствует строчным буквам в bash?
  • Может ли Bash Variable Expansion выполняться непосредственно при вводе пользователя?
  • Расширяет ли расширение zsh по-разному в неинтерактивных скриптах?
  • Передача путей и имен файлов в программу из сценария bash
  • Linux и Unix - лучшая ОС в мире.