Intereting Posts
Действие крюка при создании процесса Как проверить контрольную сумму с помощью одной командной строки? Присвоение вывода ls переменной приводит к неожиданному поведению dirname недействительный параметр `b` DLNA-сервер в Linux Как установить переменную среды оболочки из файла autotools .am? Как я могу показать кириллические символы mutt на OpenBSD? неразрешенные символы sudo perf запись / отчет Безопасно ли символически ссылаться на / usr / include / x86_64-linux-gnu / sys из / usr / include / sys? Должен ли я попытаться избавиться от «несоответствующего ioctl для устройства» в выводе strace для сценария Bash? Выполняется скрипт Python во время блокировки экрана Кто-нибудь может помочь отладить эти сообщения об ошибках ata? Как добавить бесполезную случайную строку в команду linux, чтобы идентифицировать ее через ps? Сценарий BASH для входа на сайт Временное DNS-решение для локального ip (для временного перенаправления http)

Как перебирать список файлов с отсортированными пробелами (без учета регистра)?

Я делаю это в OSX, который использует bash, но, очевидно, не все соглашения bash используются так, надеюсь, ваше предложение доступно мне 🙂

У меня есть следующие файлы

  1. fun bar1.txt
  2. Foo bar2.tXT (это верхний регистр XT)
  3. fun fun.txt

Что я должен делать, чтобы отсортировать список файлов в порядке?

что-то вроде:

 for i in (my-sorted-file-list); do echo $i done 

Любые идеи, как это можно сделать? большое спасибо

Очень просто:

 for i in *; do echo "<$i>" done 

Это использует globing файла bash. Сорт не нужен, поскольку bash уже сортирует расширения pathname.
От man bash :

  Pathname Expansion After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern. 

Пример результата:

 $ touch 'fun bar1.txt' 'Foo bar2.tXT' 'fun fun.txt' $ for i in *; do echo "<$i>"; done <Foo bar2.tXT> <fun bar1.txt> <fun fun.txt> 

Обратите внимание, что порядок сортировки зависит от LC_COLLATE (как утилита sort ). Если вы хотите нечувствительность к регистру, используйте LC_COLLATE=en_US.utf8 . Если вы хотите сортировать LC_COLLATE=C , используйте LC_COLLATE=C

Также man bash :

  LC_COLLATE This variable determines the collation order used when sorting the results of pathname expansion, and determines the behavior of range expressions, equivalence classes, and collating sequences within pathname expansion and pattern matching. 

Если ни одна из них не содержит символы новой строки, это приведет к сортировке списка:

 _state=$(set +o) set -f IFS=' ' ; for f in $(set +f; printf %s\\n * |sort) ; do echo "$f" ; done eval "$_state" 

То есть, он предоставит вам отсортированный список всех файлов в текущем каталоге – здесь представлен * .

Одно можно иметь в виду: в

 for i in *.{txt,py,c}; do ... 

*.{txt,py,c} сначала расширен до *.txt *.py *.c .

Пока *.txt сортируется, *.{txt,py,c} нет. Это также означает, что если нет файла .py , вы будете перебирать литеральную строку *.py .

Если вы хотите отсортированный глобальный список, вы должны использовать оператор чередования чередования, а не расширение брекетов. С bash :

 shopt -s extglob for i in *.@(txt|py|c); do... 

Независимо от того, будет ли сортировка выполнена чутко или нет, зависит от локали. Чтобы принудительно сортировать регистрозависимую сортировку в текущей локали, с помощью zsh вы можете определить новый порядок сортировки, например:

 ci() REPLY=${(L)REPLY} for i (*.(txt|py|c))(N.o+ci)) {...}