Bash разделил список файлов

Можно управлять любым окном с wmctrl. Этот сценарий открывает несколько mtr окон, назовите их исключительно, и располагает их на экран.


#!/bin/bash
OPTS='--gtk --interval=30'


function place_mtr
{
        host=$1
        name=mtr_$1
        xpos=$2
        ypos=$3
        xsize=$4
        ysize=$5

        mtr $OPTS $host &
        sleep 1
        wmctrl -r "My traceroute" -N "$name"
        wmctrl -r "$name" -e 0,$xpos,$ypos,$xsize,$ysize
}


place_mtr www.debian.org 0 0 710 150
place_mtr www.ubuntu.com 0 203 710 150
place_mtr www.kernel.org 0 390 710 150

place_mtr www.yahoo.com 770 0 710 150
place_mtr www.facebook.com 770 203 710 150
place_mtr www.google.com 770 390 710 150

8
02.04.2014, 01:13
2 ответа

Метод №1 - Использование head & tail

Вы можете использовать команду head , чтобы извлечь первые 40 файлов из списка файлов следующим образом:

$ head -40 input_files | xargs ...

Чтобы получить следующие 40:

$ tail -n +41 input_file  | head -40 | xargs ...

...

$ tail -n +161 input_file | head -40 | xargs ...

Вы можете продолжать идти по списку, 40 за раз, используя ту же технику.

Метод №2 - Использование xargs

Если у вас есть все ваши имена файлов в переменной, вы можете использовать xargs , например, так, чтобы разбить список на части по X элементов.

Пример

Представьте, что мои файлы называются 1-200. Поэтому я загружаю их в переменную следующим образом:

$ files=$(seq 200)

Вы можете увидеть первую пару элементов в этой переменной:

$ echo $files  | head -c 20
1 2 3 4 5 6 7 8 9 10

Теперь мы используем xargs , чтобы разделить их:

$ xargs -n 40 <<<$files
1 2 3 4 5 6 7 8 9 10 ...
41 42 43 44 45 46 47 ...
81 82 83 84 85 86 87 ...
121 122 123 124 125 ...
141 142 143 144 145 ...
161 162 163 164 165 ...
181 182 183 184 185 ...

Тогда вы могли бы передайте указанную выше команду другому xargs , который затем запустит вашу программу:

$ xargs -n 40 <<<$files | xargs ...

Если содержимое списка файлов нелегко получить из переменной, вы можете дать xargs a list через файл:

$ xargs -n 40 <input_file
1 2 3 4 5 6 7 8 9 10 ...
41 42 43 44 45 46 47 ...
81 82 83 84 85 86 87 ...
121 122 123 124 125 ...
141 142 143 144 145 ...
161 162 163 164 165 ...
181 182 183 184 185 ...

Метод № 3 - Массивы Bash

Допустим, у вас есть имена файлов в массиве Bash. Я снова использую последовательность чисел от 1 до 200 для обозначения имен моих файлов.

$ foo=( $(seq 200) )

Вы можете увидеть содержимое массива следующим образом:

$ echo ${foo[@]}
1 2 3 4 5 ....

Теперь, чтобы получить 1-е 40:

$ echo "${foo[@]:0:40}"

2-е 40 и т. Д .:

$ echo "${foo[@]:40:40}"
...
$ echo "${foo[@]:160:40}"
14
27.01.2020, 20:08

Это идеальный рецепт для xargs :

cat list_of_files | xargs -n 40 command

Цитата из man xargs :

 -n number   Set the maximum number of arguments taken from standard input
             for each invocation of the utility.  An invocation of utility
             will use less than number standard input arguments if the
             number of bytes accumulated (see the -s option) exceeds the
             specified size or there are fewer than number arguments
             remaining for the last invocation of utility.  The current
             default value for number is 5000.

Чтобы выполнять разные действия для каждого набора, вам нужно получить соответствующие строки перед их передачей в xargs :

 sed -n '1,40p' list_of_files | xargs command1
 sed -n '41,80p' list_of_files | xargs command2
 ...     
8
27.01.2020, 20:08

Теги

Похожие вопросы