«Список аргументов слишком длинный» для цикла

Мой сценарий оболочки выглядит так:

#!/bin/bash for file in *.fasta do signalp $file > $file.txt done 

В рабочей папке у меня 18.000 файлов .fasta. Я хочу запускать каждый через программу signalp. Я думаю, его слишком много файлов в папке, но я не знаю, как настроить мой код. Любая помощь?

2 Solutions collect form web for “«Список аргументов слишком длинный» для цикла”

Вы можете использовать find :

 find . -maxdepth 1 -type f -exec sh -c 'signalp "$1" >"$1".txt' _ {} \; 
  • -maxdepth 1 сделает find для поиска файлов ( -type f ) только в текущем каталоге

  • sh -c 'signalp "$1" >"$1".txt' выполнит команду signalp для всех найденных файлов и сохранит вывод в файлах с именем после добавления .txt к исходным именам файлов.

У вас argument list too long ошибка argument list too long потому что вы не цитируете свои аргументы. Происходит расширение – хотя сложно сказать, что это такое – на значение $file которое генерирует больше аргументов . Моя теория – это одно из ваших имен файлов, которое содержит еще один * который снова расширяется, чтобы снова совпадать со всеми вашими сопоставленными файлами.

Вы можете сделать это в оболочке, и вам не нужно вызывать целую новую оболочку через find чтобы сделать это.

Просто сделайте это:

 for f in ./*.fasta do signalp "$f" >"$f.txt" done 

…видеть? Двойные кавычки предотвращают интерпретацию содержимого переменной итеративной переменной $f , но буквально – даже если $f содержит расширяемые метасимволы вида.

Конечно, это не лучшее решение для групп из 18k файлов. Он будет работать, но было бы лучше, если бы вы могли его продолжить .

В качестве примера предположим, что у самих файлов есть какой-то порядок . Может быть, они названы так …

 aaa001.fasta ... bbb001.fasta 

И так далее. В этом случае вы можете сделать что-то вроде:

 for l in abcdefghijklmnopqrstu vxyz do for f in "./$l$l$l"*.fasta do singalp "$f" >"$f.txt" done; done 

… и поэтому вам не нужно будет хранить весь список 18k в памяти в течение всего цикла.

  • как обмениваться переменными среды между оболочками, такими как глобальные переменные, связанные с мастером pid?
  • localhost cron issue, log показывает, что cmd запущен, но сценарий фактически не запускался. Что я делаю неправильно?
  • Bash назначает вывод / ошибку переменной
  • Понимание среды Linux Back-Slash и звездочки
  • Уменьшить резервный файл журнала
  • Создайте файл журнала с тем же именем, что и входной файл
  • сценарий оболочки для автоматического уничтожения процессов, соответствующих определенным критериям
  • SSH на два адреса, используйте тот, который подключается первым
  • Как читать строки из файла и комбинировать перед сопоставлением шаблона из другого файла?
  • Как написать сценарий оболочки, который запускается при входе в систему?
  • Какая цель служит толстой кишки?
  • Linux и Unix - лучшая ОС в мире.