Я пытаюсь составить список всех подкаталогов с наименьшим номером.
Например, для следующего списка:
/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
примечание: этот скрипт не будет работать, если во втором каталоге будут разные цифры номера