Сортировать файлы каталога по номеру

Я обновил то, что вы пытались сделать, с помощью некоторой базовой отладки, при этом достигнув того, что, как я полагаю, вы хотите:

read -p "Please specify a location/file to be searched...Example=/var/tmp/test.txt     : " location
while [[ ! -f ${location} ]] ; do
  read -p "Unable to located file specified, please try again" location
done
read -p "Please specify a search term :" search
result=$(grep -w ${search} ${location} | wc -w)
echo "The search term ${search}, appears ${result} times inside of ${location}"
0
26.09.2018, 21:32
4 ответа

ls по умолчанию уже будет сортировать лексически. Вы просто читаете их в неправильном порядке, когда они изложены в такой краткой форме. Прочитайте каждую колонку, а затем перейдите к следующей. Чтобы увидеть фактический лексический порядок ls, выведите по одному объекту в строке:

$ ls -1
0
1
2
3
4
catalog.svg
config.yml
0
28.01.2020, 02:15

sort -nсортирует "по числовому значению строки"; в этой ситуации, когда sortпытается численно сравнить число с буквой, он возвращается к memcmpсоответствующих байтов, помещаяc(ASCII 99 )после0(ASCII 48 ). С опцией --debugсортировки GNU вы можете увидеть, как происходит сбой :

.
$ ls |sort -n --debug
sort: using ‘en_US.UTF-8’ sorting rules
0
_
_
catalogIcon-gitlab.svg
^ no match for key
______________________
zoo
^ no match for key
___
1
#... continues...

Для решения только для bash -я бы использовал цикл (, предполагая, как вы указываете, что каталоги начинаются с0):

highest=-1
for d in *; do [[ -d "$d" ]] || continue; [[ "$d" -gt "$highest" ]] && highest=$d; done
printf '%s\n' "$highest"
2
28.01.2020, 02:15

Попробуйте это, чтобы получить каталог с максимальным номером:

max=$(printf "%s\n" */ | sort -n | tail -1)
echo "${max%/}"
4
28.01.2020, 02:15

Как насчет?:

ls -1v
0
1
2
3
4
12
23
catalog.svg
config.yml

v означает versionпорядок сортировки.

Чтобы получить последнее (наибольшее )число, выберите только числа:

$ ls -1v | grep -x '[0-9]*'
0
1
2
3
4
12
23

И в хвост:

$ ls -1v | grep -x '[0-9]*' | tail -n 1
23

Единственное решение для bash:

$ max=0; for d in */; do d=${d%/}; [[ d -gt max ]] && max=$d; done; printf '%d\n' "$max"
23
0
28.01.2020, 02:15

Теги

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