найти подкаталоги с наименьшим номером

найти подкаталоги с наименьшим номером

Я пытаюсь составить список всех подкаталогов с наименьшим номером.

Например, для следующего списка:

/100/2001  
/100/2003  
/101/2001  
/101/2004  
/102/2000  
/102/2003  
/102/2005  

Я хочу получить только:

/100/2001  
/101/2001  
/102/2000

решение1

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

/100/2001
/100/2003
/101/2001
/101/2004
/102/2000
/102/2003
/102/2005

Команда ls автоматически делает это, но по умолчанию она делает алфавитно-цифровую сортировку. Если все ваши под-подкаталоги имеют имена одинаковой длины, то это будет приемлемо.

SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do ls -d $SUBDIR/???? | head -1 done

Как это работает: for SUBDIR in $SUBDIRLIST
Посмотрите в каждом каталоге в списке. Список определен в предыдущей строке. Я решил использовать 10?, чтобы выбрать записи длиной в три символа и начинающиеся с 10, но вы могли бы точно так же сказать, SUBDIR=*если хотите использовать все.

ls -d $SUBDIR/????

  • lsкоманда для отображения отсортированных записей содержимого $SUBDIR
  • Выбирает ????только записи длиной в четыре символа. Вы можете выбрать *, если вам все равно, или если у вас есть другие каталоги, которые следует игнорировать, ограничьте его еще больше, используя выражение типа20??

| head -1 - Передайте список через «команду head» - Head отобразит только первую строку и отбросит остальные.

Вам потребуется немного другое решение, если все имена каталогов имеют разную длину, например:
SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do find $SUBDIR -depth 1 | sort -n | head -1 done

В этом случае мы используем find, потому что ls отсортирует записи, но сделает это неправильно, поэтому это излишне. Find не сортирует записи (по умолчанию).

sort -nзатем сортирует найденные элементы, при этом -nследя за тем, чтобы они обрабатывались как числа, так что 20 предшествует 100.

Снова head -1отбрасывает все, кроме первой строки.

И наконец, SUBDIRLIST=10?оператор выбирает только подкаталоги, начинающиеся с 10 и имеющие три символа в имени. Вы можете ограничить его больше или меньше, в зависимости от ваших потребностей. Например, SUBDIRLIST=*выбирает все, SUBDIRLIST=???выбирает все записи, имеющие три символа.

решение2

Это должно сработать:

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

Выход:

/100/2001
/101/2001
/102/2000

решение3

Для этого ввода это можно сделать с помощью:

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

решение4

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

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

примечание: этот скрипт не будет работать, если во втором каталоге будут разные цифры номера

Связанный контент