;
: команды, разделенные ;
, выполняются последовательно. Оболочка ожидает завершения каждой команды по очереди.
& &
: команда после & &
выполняется в случае и только в случае, если команда перед & &
возвращает нулевое состояние выхода. Его можно считать оператором AND
.
|
: труба. В выражении command1 | command2
Стандартный выход command1 соединен трубопроводом со стандартным входом command2.
Существует больше аналогичных управляющих операторов, следует упомянуть:
| |
: команда после | |
выполняется, если и только если команда перед | |
возвращает ненулевое состояние выхода. Его можно считать оператором OR
. Обратите внимание, что |
и | |
- совершенно разные животные.
&
: оболочка выполняет команду, завершенную &
в фоновом режиме, не ожидает завершения команды и немедленно возвращает код выхода 0. Опять же, &
не имеет ничего общего с & &
.
| &
: краткое описание для 2 > & 1 |
, т.е. и стандартный выход, и стандартная ошибка command1 подключены к стандартному входу command2 через трубу.
Кроме того, при использовании zsh
можно также запустить команду с помощью & |
или &!
. В этом случае задание сразу открещивается, после запуска ему не место в таблице заданий.
-121--17706-
Все три скорее отличаются друг от друга, особенно |
.
|
: Прежде всего это называется 'pipe', и может использоваться для перенаправления выходных данных одной программы в другую. Ваш пример не сделает ничего значимого, потому что человек ни для чего не использует стандартный ввод. Более значимым примером будет man grep | grep -- -v
, который найдет '-v' в выходных данных man grep
;
: точка с запятой может быть использована вместо новой строки, чтобы вещи занимали меньше места.
& &
: Оператор двух амперсанд является логическим оператором AND , что означает, что команда после & &
будет выполняться, если, и только если, команда в левой части возвращает значение true, что в UNIX-системах означает, что она возвращается с кодом exit 0.
-121--17709-
Другие ответы уже объясняют |
, &
и ;
, поэтому я добавлю что-то дополнительное, что вы явно не просили: | |
.
A || B
Выполняется
, а затем B
выполняется только в случае сбоя A
. Это полезно для реагирования на условия ошибки:
martin@martin ~ % rm doesnotexist 2>/dev/null || echo "failed to delete file"
failed to delete file
( 2 >/dev/null
необходимо для скрытия сообщения об ошибке самого rm
.)
Для самого низкого каталога из каждого каталога, вам нужно отсортировать вывод в каждом каталоге.
/100/2001
.
/100/2003
/101/2001
/101/2004
/102/2000
/102/2003
/102/2005
команда ls делает это автоматически, но по умолчанию она выполняет сортировку по буквам и цифрам. Если все ваши подкаталоги имеют имена одинаковой длины, то это будет приемлемо.
SUBDIRLIST=10?
для SUBDIR в $SUBDIRLIST
делать
ls -d $SUBDIR/???? | голова -1
готовый
Как это работает:
для SUBDIR в $SUBDIRLIST
Ищите в каждом каталоге в списке. Список определен в предыдущей строке. Я выбрал 10?, чтобы выбрать записи длиной в три символа и начать с 10, но вы могли бы также сказать SUBDIR=*
, если хотите использовать все.
ls -d команда $SUBDIR/????
ls
для отображения отсортированных записей содержимого $SUBDIR ????
выбирает только те записи, которые длиной в четыре символа. Вы можете выбрать *, если вам все равно, или если у вас есть другие каталоги, которые следует игнорировать, ограничьте их в дальнейшем, используя выражение типа 20??
| head -1
.
- Передайте список через "команду руководителя"
- Голова отобразит только первую строку, а остальные отбросит.
Нужно немного другое решение, если все имена каталогов имеют разную длину, например:
SUBDIRLIST=10?
для SUBDIR в $SUBDIRLIST
делать
найти $SUBDIR -depth 1 | сортировка -n | голова -1
готовый
В этом случае мы используем find, потому что ls отсортировал бы записи, но он сделал бы это неправильно, так что это излишне. Поиск не сортирует записи (по умолчанию).
сортирует -n
затем сортирует найденные элементы, где -n
убеждается, что они рассматриваются как числа, так что 20 идет раньше 100.
Еще раз голова -1
отбрасывает все, кроме первой строки.
И, наконец, оператор SUBDIRLIST=10?
выбирает только подкаталоги, начинающиеся с 10 и имеющие три символа в имени. Вы можете ограничить его более или менее, в зависимости от ваших потребностей. Например, SUBDIRLIST=*
выбирает все, SUBDIRLIST=???
выбирает все записи, состоящие из трех символов.
Это должно сделать фокус:
ls -1d /*/200{0,1}
Ouput:
/100/2001
/101/2001
/102/2000
Для этого входа можно использовать:
awk -F/ 'min[$2]==0 { min[$2]=$3; next; };
{ if (min[$2]>$3) min[$1]=$3;};
END {for (val in min) { print "/" val "/" min[val] };}'
awk
сортировки по первому полю. Не знаю, гарантировано ли это или просто совпадение. Чтобы быть уверенным, вы можете подключить вывод awk в
sort --field-separator=/ -n
В Perl:
perl -le 'for (</*/*>){
($first,$second)=(split m{/})[1,2];
push @{$entries{$first}},$second
}
END{
for (sort {$a<=>$b} keys %entries){
$lowest = shift sort {$a<=>$b} @{$entries{$_}};
print "/$_/$lowest\n";
}
}'
Это предполагает, что все ваши каталоги будут иметь чисто числовые имена.
Что-то вроде этого?
for firstdir in `ls .`; do
seconddir=`ls -1 ./$firstdir | head -n 1`
echo $firstdir/$seconddir
done
примечание: этот сценарий не будет работать, когда вторая директория будет иметь другой номер
.