Файлы списка отсортированы численно

Похож, возможно, Вы не устанавливаете канал и "режим". Я использую простой сценарий, который делает эти команды оболочки:

ifconfig wlan0 down
iwconfig wlan0 mode managed
ifconfig wlan0 up
iwconfig wlan0 channel 3
iwconfig wlan0 key xxxxxxxxxx
iwconfig wlan0 key restricted
iwconfig wlan0 essid "Blah Blah Foo Bar"
iwconfig wlan0 ap xx:yy:zz:aa:bb:cc
sleep 5
dhcpcd -d wlan0

Необходимо вставить ключ и MAC-адрес точки доступа. Это находится под Slackware 13.1, и я использую WRT54GL рабочий DD-WRT. Очень к моему позору, я использую шифрование WEP. Я должен был сделать некоторое экспериментирование о когда к "ifconfig" и wlen к "iwconfig" и в какой порядок установить ESSID и AP.

126
07.05.2014, 02:46
11 ответов

bashфигурные скобки, {}, перечислит их в порядке:

for file in log{1..164}.gz; do
    process "$file"
done
41
27.01.2020, 19:29

Почему не использовать встроенный ls функция этого конкретного случая, а именно,

-v natural sort of (version) numbers within text

Например, ls -1v log*

280
27.01.2020, 19:29
  • 1
    Потрясающим решением, хотя я желаю, было использование одинаково простого решения sort, в случае, если у каждого есть массив строк, а не каталог файлов –  Hubro 06.01.2015, 09:56
  • 2
    На BSD/OSX эта опция - что-то еще: -v - Force unedited printing of non-graphic characters. –  kenorb 26.02.2015, 19:33
  • 3
    , К сожалению,-v опция, не доступен на AIX (6.1) –  bouvierr 17.10.2016, 18:40
  • 4
    Это должно быть лучшим ответом. –  32r34wgf3e 23.10.2017, 20:11

С GNU ls (т.е. на Linux, Cygwin или других системах, которые имеют GNU ls конкретно установленный):

ls -v

В zsh:

echo *(n)

В других оболочках:

echo log?.gz log??.gz log???.gz

Замена echo printf '%s\n' если Вы хотите каждое имя файла на отдельной строке.

Если Вы хотите метаданные файла также (ls -l) и у Вас нет GNU ls, необходимо будет звонить ls отдельно для каждого имени файла или группы имен файлов, которые Вы хотите видеть в лексикографическом порядке.

ls -ld log?.gz; ls -ld log??.gz; ls -ld log???.gz

Для предотвращения этих трудностей использование, достаточно продвижения обнуляет в именах файлов так, чтобы лексикографический вид был человечески-благоприятен (log001.gz, и т.д.).

48
27.01.2020, 19:29

Решение для Perl:

ls log*.gz | perl -ne 'sub getnum{ $_[0] =~ /log(\d+)\.gz/; $1 }; push @A, $_; END{ print sort { getnum $a <=> $b } @A}'
1
27.01.2020, 19:29

В то время как решение ls -1v является, конечно, самым хорошим в данном случае, я думаю, что хорошо иметь также то, которое работает с sort как в исходном вопросе, так как это работает также, когда Ваш вход не прибывает из ls. В этом случае можно использовать:

ls -1 | sort -n -k1.4

-n опция говорит вид виду численно, и -k 1.4 устанавливает ключ сортировки на первое поле (который является целым именем файла в этом случае), начинающий с 4-го символа до последнего.

29
27.01.2020, 19:29
  • 1
    В моем случае, ls -1 | sort -n -k1.4 не работает. Это дает неотсортированные сначала, до 4 символов затем отсортировали после 4-го символа. Я использовал ls -1 |sort | sort -n -k1.4 вместо этого и это работало отлично. –  Prabhu 12.09.2014, 23:53
  • 2
    @Prabhu, вместо этого, Вы могли сделать sort -k1.1,1.3 -k1.4n. sort реализации не требуются, чтобы быть стабильными, таким образом, Ваш подход не будет работать со всеми реализациями. См. также -V опция GNU и FreeBSD sort. –  Stéphane Chazelas 26.05.2015, 14:11

Моя версия Соляриса не поддерживает ls -v (grrr). И решение для вида, предоставленное выше 1) требует знания положения цифр в имени файла и 2) не обрабатывает вещи как многослойные номера версий.

Подход ниже совместим с Солярисом, не требует предвидения позиций символа и обрабатывает номера версий с 2, 3 или 4 компонента (как: a-1.2, нечто 5.6.7, bar_baz_9.10.11.12). Это также использует sort -f сворачиваться верхний - и нижний регистр вместе, и правильно обрабатывает каталоги, смешанные с файлами:

ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n

Обратите внимание, что эта версия ограничивает первый компонент единственной цифрой.

Если Ваша целевая операционная система (системы) поддерживает ls -v, это - ясно отличное решение.

3
27.01.2020, 19:29

GNU sort (как доступно в Linux) имеет режим "сортировки версий", который интерпретирует числа внутри нечисел просто так, как вы просите:

Из man 1 sort:

 -V, --version-sort
 натуральный вид (версии) номеров в тексте

(Создание пустых тестовых файлов для списка:
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102. gz)

Пример вашего случая, добавив опцию -V (или --версия-sort):

ls -1 log*.gz | sort -V
log1.gz
log2.gz
log3.gz
log99.gz
log100.gz
log101.gz
log102.gz
22
27.01.2020, 19:29
$ ls
log101.gz  log102.gz  log103.gz  log104.gz  log105.gz  log106.gz  log10.gz  log1.gz
$ ls | sort -t . -n -k1.4
log1.gz
log10.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
1
27.01.2020, 19:29

, если вы используете Mac или BSD, попробуйте следующее:

ls -1 *.jpg | sort -n
7
27.01.2020, 19:29

Мне это помогло.

У меня есть файлы 1.jpg 2.jpg... 18.jpg

$ echo *.jpg | tr -s ' ' '\n' | sort -n

sortпутают с выводом lsиз-за непечатаемых цветных символов. Если вы попробуете это:

ls -1 --color=none *.jpg | sort -n

это будет работать отлично.

sortможет игнорировать непечатаемые символы с опцией -i, но это все еще не работает, и я не знаю, почему.

Но вы всегда можете убрать цвет таким образом, и sortбудет работать:

ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n

Я надеюсь, что однажды sortпоявится такая возможность.

0
27.01.2020, 19:29

Команда:

ls -l | sort --human-numeric-sort
-1
01.05.2020, 18:44

Теги

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