найдите подкаталоги с самым низким количеством

  • ; : команды, разделенные ; , выполняются последовательно. Оболочка ожидает завершения каждой команды по очереди.

  • & & : команда после & & выполняется в случае и только в случае, если команда перед & & возвращает нулевое состояние выхода. Его можно считать оператором 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 .)

1
06.05.2014, 12:33
5 ответов

Для самого низкого каталога из каждого каталога, вам нужно отсортировать вывод в каждом каталоге.

/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=??? выбирает все записи, состоящие из трех символов.

.
1
28.01.2020, 01:56

Это должно сделать фокус:

ls -1d /*/200{0,1}

Ouput:

/100/2001
/101/2001
/102/2000
0
28.01.2020, 01:56

Для этого входа можно использовать:

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
0
28.01.2020, 01:56

В 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";
              }
          }'

Это предполагает, что все ваши каталоги будут иметь чисто числовые имена.

0
28.01.2020, 01:56

Что-то вроде этого?

for firstdir in `ls .`; do
  seconddir=`ls -1 ./$firstdir | head -n 1`
  echo $firstdir/$seconddir
done

примечание: этот сценарий не будет работать, когда вторая директория будет иметь другой номер

.
-1
28.01.2020, 01:56

Теги

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