Исторически, в редакторе 'редактора' (который многие из ядра :commands
в конечном счете происходите из), строка перешла бы к stdout.
Конечно, так как энергия является полноэкранным редактором, вывод команд только переходит необработанный к stdout, а скорее отображен у основания окна. (одна строка входит в линейку команд, больше чем одна строка [технически больше, чем 'cmdheight'
] добирается, "НАЖИМАЮТ ENTER или вводят команду для продолжения", больше, чем будут соответствовать на экране, получает a -- More --
подсказка.)
Когда Вы просто вводите :p
Вы будете видеть (Вы не могли заметить), строка, Вы идете, появляются в линейке команд.
Эта команда не особенно полезна самостоятельно (было немного более полезно в редакторе, когда строка, которую Вы редактируете, не была бы иначе отображена на экране), но становится более полезным в сочетании с другими способами адресации. Например, :g/re/p
(где ре является любым регулярным выражением), как, часто утверждали, был источником названия grep
команда.
Принятие того имеет соответствующую версию ls
, это - возможно самый простой путь:
ls -I "*.txt" -I "*.pdf"
Если Вы хотите выполнить итерации через все подкаталоги:
ls -I "*.txt" -I "*.pdf" -R
С bash
расширенный globbing (включают с shopt -s extglob
), шарик !(*.txt|*.pdf)
должен работать. Можно передать этот шарик непосредственно любой команде, которая берет аргументы файла, включая, но не ограничиваясь, ls
.
-d
избегать что: ls -d !(*.txt|*.pdf)
– legends2k
11.11.2014, 16:43
Найдите поддержки -o
find . ! '(' -name '*.txt' -o -name '*.pdf' ')'
Вам нужна круглая скобка для создания права приоритета. Найдите делает много материала; я предлагаю прочитать его страницу справочника.
Можно также сделать или в grep
(но действительно, Вы не должны анализировать вывод ls
)
ls | grep -Ev '\.(txt|pdf)$' | column
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
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' *
find /path/to/directory '!' -name '*.pdf' '!' -name '*.txt'
Это эквивалентно команде с операцией ИЛИ из-за законов De Morgan.
Как предложено 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
функция.
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 моей интерактивной оболочки.
Если у вас нет подкаталога
ls !(*.pdf|*.txt)
тоже должно работать!
Но
ls -I "*.pdf" -I "*.txt"
— общепринятый способ.
ls
опции не являются портативными. – bahamat 05.09.2012, 23:45ls
действительно не принадлежит портативных сценариев так или иначе, таким образом, я предполагал, что OP спрашивает об интерактивном использовании только. – jw013 05.09.2012, 23:53