8

Вопрос по bash, linux – Bash: как пройти через структуру каталогов и выполнить команды?

Я разбил большой текстовый файл на несколько наборов меньших для тестирования производительности, которое я делаю. Есть несколько каталогов, подобных этому:

/home/brianly/output-02 (contains 2 files myfile.chunk.00 and myfile.chunk.01)
/home/brianly/output-04 (contains 4 files...)
/home/brianly/output-06 (contains 6 files...)

Важно отметить, что в каждом каталоге растет число файлов. Что мне нужно сделать, это запустить исполняемый файл для каждого из текстовых файлов в выходных каталогах. Команда выглядит примерно так с одним файлом:

./myexecutable -i /home/brianly/output-02/myfile.chunk.00 -o /home/brianly/output-02/myfile.chunk.00.processed

Здесь параметр -i является входным файлом, а параметр -o - выходным местоположением.

В C # я зацикливаю каталоги, получаю список файлов в каждой папке, затем зацикливаю их для запуска командной строки. Как мне пройти через структуру каталогов с помощью bash и выполнить команду с правильными параметрами, основанными на расположении и файлах в этом расположении?

  • Error: User Rate Limit ExceededsoError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
6 ответов
  • 2

    Как и предполагали другие, используйте

    find(1):

    # Find all files named 'myfile.chunk.*' but NOT named 'myfile.chunk.*.processed'
    # under the directory tree rooted at base-directory, and execute a command on
    # them:
    find base-directory -name 'output.*' '!' -name 'output.*.processed' -exec ./myexecutable -i '{}' -o '{}'.processed ';'
    

  • 7

    Что-то вроде:

    for x in `find /home/brianonly -type f`
    do
    ./yourexecutable -i $x -o $x.processed
    done
    

  • 0

    Используйте find и exec. Посмотрите на следующие

    http://tldp.org/LDP/abs/html/moreadv.html

  • 8

    Для такого рода вещей я всегда используюfind вместе сxargs:

    $ find output-* -name "*.chunk.??" | xargs -I{} ./myexecutable -i {} -o {}.processed
    

    Теперь, когда ваш скрипт обрабатывает только один файл за раз, используя-exec (или же-execdir) непосредственно сfindкак уже предлагалось, так же эффективно, но я привык использоватьxargsЭто обычно намного эффективнее при подаче команды, работающей с несколькими аргументами одновременно. Таким образом, это очень полезный инструмент для хранения в одном поясе, поэтому я подумал, что об этом следует упомянуть.

  • 0

    Это то, что

    find команда для.

    http://linux.die.net/man/1/find

  • 1

    Судя по предоставленной информации

    это выглядит как прямой перевод вашей идеи C #.

    for i in /home/brianly/output-*; do
        for j in "$i/"*.[0-9][0-9]; do
            ./myexecutable -i "$j" -o "$j.processed"
        done
    done