Как я перечисляю каждый файл в каталоге кроме тех, которые имеют указанные расширения?

Исторически, в редакторе 'редактора' (который многие из ядра :commands в конечном счете происходите из), строка перешла бы к stdout.

Конечно, так как энергия является полноэкранным редактором, вывод команд только переходит необработанный к stdout, а скорее отображен у основания окна. (одна строка входит в линейку команд, больше чем одна строка [технически больше, чем 'cmdheight'] добирается, "НАЖИМАЮТ ENTER или вводят команду для продолжения", больше, чем будут соответствовать на экране, получает a -- More -- подсказка.)

Когда Вы просто вводите :p Вы будете видеть (Вы не могли заметить), строка, Вы идете, появляются в линейке команд.

Эта команда не особенно полезна самостоятельно (было немного более полезно в редакторе, когда строка, которую Вы редактируете, не была бы иначе отображена на экране), но становится более полезным в сочетании с другими способами адресации. Например, :g/re/p (где ре является любым регулярным выражением), как, часто утверждали, был источником названия grep команда.

29
04.09.2012, 22:23
8 ответов

Принятие того имеет соответствующую версию ls, это - возможно самый простой путь:

ls -I "*.txt" -I "*.pdf"

Если Вы хотите выполнить итерации через все подкаталоги:

ls -I "*.txt" -I "*.pdf" -R
29
27.01.2020, 19:38
  • 1
    GNU ls опции не являются портативными. –  bahamat 05.09.2012, 23:45
  • 2
    ls действительно не принадлежит портативных сценариев так или иначе, таким образом, я предполагал, что OP спрашивает об интерактивном использовании только. –  jw013 05.09.2012, 23:53
  • 3
    Почему ls не является портативным? Что я должен использовать затем? –  Freedo 17.01.2018, 06:39

С bash расширенный globbing (включают с shopt -s extglob), шарик !(*.txt|*.pdf) должен работать. Можно передать этот шарик непосредственно любой команде, которая берет аргументы файла, включая, но не ограничиваясь, ls.

12
27.01.2020, 19:38
  • 1
    +1, но если бы у Вас есть подкаталоги затем их содержание, был бы перечислен также; использовать -d избегать что: ls -d !(*.txt|*.pdf) –  legends2k 11.11.2014, 16:43
  • 2
    Спасибо, я точно искал синтаксис для принятия нескольких файлов, это будет соответствовать хорошо здесь stackoverflow.com/questions/216995 / … –  Freedo 17.01.2018, 06:40

Найдите поддержки -o

find . ! '(' -name '*.txt' -o -name '*.pdf' ')'

Вам нужна круглая скобка для создания права приоритета. Найдите делает много материала; я предлагаю прочитать его страницу справочника.

Можно также сделать или в grep (но действительно, Вы не должны анализировать вывод ls)

ls | grep -Ev '\.(txt|pdf)$' | column
28
27.01.2020, 19:38
  • 1
    Спасибо!, Почему я не должен анализировать вывод ls? –  Andrew 04.09.2012, 22:36
  • 2
    @Andrew сначала, потому что ее хрупкое (рассматривают имя файла с новой строкой в нем — да, это - имя правильного файла —-print0/-exec/-delete/etc. находки, избегает той проблемы); во-вторых, потому что обычно существует более легкий путь. –  derobert 04.09.2012, 22:38
  • 3
    В дополнение к find страница справочника, я искренне рекомендую статьи Unix Power Tools о find, такой как docstore.mik.ua/orelly/unix3/upt/ch09_06.htm и docstore.mik.ua/orelly/unix3/upt/ch09_12.htm –  Wildcard 18.12.2015, 22:41
  • 4
    Только помочь декодировать оператор для людей: find . NOT ( *.txt OR *.pdf ) –  wisbucky 08.03.2018, 00:08

В zsh с extendedglob:

print -rl -- *~*.(txt|pdf)

или

print -rl -- ^*.(txt|pdf)

Или с kshglob (да, который является ksh globbing не, "колотят расширенный globbing"):

print -rl -- !(*.txt|*.pdf)

Помните, хотя это они также исключают точечные файлы.

ksh93 имеет FIGNORE (mis) функция:

FIGNORE='@(.|..|*.txt|*.pdf)'
printf '%s\n' *
6
27.01.2020, 19:38
find /path/to/directory '!' -name '*.pdf' '!' -name '*.txt'

Это эквивалентно команде с операцией ИЛИ из-за законов De Morgan.

4
27.01.2020, 19:38

Как предложено derobert, Ваш лучший выбор состоит в том, чтобы использовать find. Однако можно на самом деле использовать результат в конвейере с другими командами.

GNU (и некоторый BSD's) find поддерживайте -print0 предикат, который говорит этому печатать имя файла, завершенное символом NUL, который символ не позволяется в имени файла и гарантиях, там не будет коллизией. Другие команды могут быть проинструктированы для использования NUL в качестве их входного разделителя.

Самым важным из которых является GNU xargs, который выполняет команду, которую Вы указываете, и передает ему список файлов как параметры командной строки. Вы хотите работать xargs -r0 в сочетании с находкой -print0 Например:

find . -type f ! \( -name \*.pdf -o -name \*.txt \) -print0 | xargs -r0 ls -ld

Это безопасно печатает длинный список каталогов всего PDF и txt файлов, включая тех, которые имеют пробелы или непечатные символы на имя.

Можно также использовать его с GNU tar следующим образом:

tar -zcf myarchive.tar.gz --null --files-from <(
  find . -type f ! -name \*.tar.gz -print0)

Это создает tar.gz файл всех файлов, имена которых не заканчиваются в .tar.gz

rsync также принимает разграниченные пустым указателем файлы с -0 параметр, также, как и несколько других. Но xargs связующее звено, которое Вы будете обычно использовать для этого типа цели. Или это или find -exec функция.

3
27.01.2020, 19:38
  • 1
    tar примером команды является хороший. В большинстве целей, тем не менее, -exec лучшее соответствие. –  Wildcard 18.12.2015, 22:43

В качестве дополнения, если вы используете оболочку, совместимую с bash, вы можете использовать переменную GLOBIGNORE, чтобы исключить результаты из сопоставления с образцом. От человека:

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

В вашем конкретном случае:

sh$ (GLOBIGNORE='*.pdf:*.txt'; ls -d *)

Обратите внимание, что я запускаю эту команду как вспомогательную оболочку (используя круглые скобки), чтобы не изменять переменную среды GLOBIGNORE моей интерактивной оболочки.

0
27.01.2020, 19:38

Если у вас нет подкаталога

ls !(*.pdf|*.txt)

тоже должно работать!

Но

ls -I "*.pdf" -I "*.txt"

— общепринятый способ.

0
27.01.2020, 19:38

Теги

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