Передача результатов поиска в xargs для запуска скрипта Python

Я вижу здесь самые странные результаты и надеялся, что кто-нибудь сможет мне это объяснить.

Итак, я использую команду find, чтобы найти все файлы типа.log, и передаю результаты этой команды в скрипт python. ТОЛЬКО первый результат команды find передается в xargs или xargs получает все результаты и передает их в виде строки в скрипт python.

Пример:

# Find returns 3 .log files
find . -name "*.log"
    file1.log
    file2.log
    file3.log

# xargs only runs the python script for first found file (or all 3 are being piped to script as a single string, and only first result is read in)
find . -name "*.log" | xargs python myscript.py -infile 
    Success: parsed file1.log

Я хочу, чтобы скрипт Python запускался для всех 3 найденных файлов.

find . -name "*.log" | xargs python myscript.py -infile 
        Success: parsed file1.log
        Success: parsed file1.log
        Success: parsed file1.log

1 ответ

Более безопасный способ сделать это следующим образом:

      find . -name "*.log" -print0 | \
    xargs -0 -I {} python myscript.py -infile {}

При передаче имен файлов из, очень важно использовать параметр -0 или -d, чтобы установить разделитель равным \0 (нулевой). Имена файлов не могут содержать символы / или \0, что гарантирует безопасное использование имени файла.

С, вы должны указать -0, чтобы сообщить об использовании разделителей \0. Вам также необходимо:

  • "-L 1", если вам просто нужно имя файла в качестве последнего аргумента.
  • "-I {}" для передачи одного или нескольких команде в любом месте команды.
Другие вопросы по тегам