Можно управлять любым окном с 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
Вы можете использовать команду 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 за раз, используя ту же технику.
Если у вас есть все ваши имена файлов в переменной, вы можете использовать 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 ...
Допустим, у вас есть имена файлов в массиве 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}"
Это идеальный рецепт для 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
...