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

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

#!/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 в памяти в течение всего цикла.

  • Общие обозначения и стандарты флагов для сценариев и функций оболочки
  • Скопируйте файлы, исключая x, y, z, вызывая ошибку в сценарии оболочки
  • Команда pipe внутри exec не будет работать
  • Как обрабатывать ключи в сценарии оболочки?
  • Трубопровод из находки в grep
  • Различное поведение eval "command \" $ @ \ "", "$ @" и "$ (echo $ @)" при использовании в качестве аргументов
  • Лучший способ запуска одиночного цикла вместо двух для циклов
  • Отправить команду в оболочку через Makefile
  • путают с переменными awk и shell
  • Как проверить shellshock против удаленной машины, используя простой скрипт
  • назначить вывод программы ac переменной оболочки: ошибка токена
  • Interesting Posts

    Нет модуля. Найдена ошибка в Linux, но отлично работает в Windows.

    Принудительное изменение размера окна Skype (под Gnome)

    Как получить группу, к которой принадлежит пользователь в SCO

    Как отправить вывод с одного терминала на другой без каких-либо новых труб или файлов

    / dev / root не существует в CentOS 7

    Изменение порядка загрузки – доступ к Linux можно только через опцию «Использовать устройство»

    Что происходит, когда файлы добавляются / удаляются в середине цикла «for f in *» sh?

    Запретить некоторые IP-адреса из определенной сети на Apache?

    Запустите git fetch после любой команды cd

    Хранение списка в переменной

    firewalld принимает ответ на запрос многоадресной DNS из эфемерного порта

    следует ли уменьшить размер / dev / shm?

    Восстановление данных, записанных в файл, который перемещен

    Где скачать Wolfenstein: Enemy Territory для Linux?

    Как выбрать строки и выполнить команду форматирования?

    Linux и Unix - лучшая ОС в мире.