Предположим, что у меня есть папка, содержащая .txt , .pdf и другие файлы. Я хотел бы перечислить «другие» файлы (т.е. файлы, не имеющие расширений .txt или .pdf ). Есть ли у вас какие-либо советы, как это сделать?
Я знаю, как перечислить файлы, не имеющие данного расширения. Например, если я хочу перечислить все файлы, кроме TXT- файлов, то либо
find -not -iname "*.txt"
или
ls | grep -v '\.txt$' | column
похоже на работу. Но как я могу перечислить все, кроме файлов .txt или .pdf ? Кажется, мне нужно использовать какое-то логическое «или» в find
или grep
.
ls
противfind
против универсализации может отличаться для скрытых составляют скрытые.find
будут проходить через подкаталоги, как рекурсивныеls
. Используйте-maxdepth 1
с,find
чтобы заставить его вести себя какls
.Ответы:
Предполагая, что у вас есть подходящая версия
ls
, это, возможно, самый простой способ:Если вы хотите перебрать все подкаталоги:
источник
ls
Опции GNU не переносимы.ls
на самом деле не относится к переносимым скриптам, так что я предполагаю, что OP спрашивает только об интерактивном использовании.Найти опоры
-o
Вам нужно круглые скобки, чтобы сделать правильный приоритет. Find делает много вещей; Я предлагаю прочитать его man-страницу.
Вы также можете сделать или в
grep
(но на самом деле, вы не должны анализировать выводls
)источник
ls
?find
я искренне рекомендую статьи о Unix Power Toolsfind
, такие как docstore.mik.ua/orelly/unix3/upt/ch09_06.htm и docstore.mik.ua/orelly/unix3/upt/ch09_12.htmfind . NOT ( *.txt OR *.pdf )
При
bash
расширенном сглаживании (включите с помощьюshopt -s extglob
) шарик!(*.txt|*.pdf)
должен работать. Вы можете передать этот глобус непосредственно любой команде, которая принимает аргументы файла, включая, но не ограничиваясьls
.источник
-d
чтобы избежать этого:ls -d !(*.txt|*.pdf)
В
zsh
сextendedglob
:или
Или с помощью
kshglob
(да, это ksh globbing, а не bash extended globbing):Помните, что они также исключают точечные файлы.
ksh93 имеет
FIGNORE
(неправильную) особенность:источник
Это эквивалентно команде с оператором ИЛИ из- за законов Де Моргана .
источник
По предложению Дероберта, вам лучше всего использовать
find
. Однако вы можете использовать результат в конвейере с другими командами.GNU (и некоторые BSD)
find
поддерживают-print0
предикат, который указывает ему печатать имя файла, оканчивающееся символом NUL , который не допускается в имени файла и гарантирует, что не будет конфликта. Другие команды могут быть проинструктированы использовать NUL в качестве разделителя ввода.Наиболее важным из них является GNU
xargs
, который запускает указанную вами команду и передает ей список файлов в качестве аргументов командной строки. Вы хотите запуститьxargs -r0
вместе с find,-print0
например:Это безопасно печатает длинный список каталогов всех файлов PDF и TXT , в том числе с пробелами или непечатными символами в имени.
Вы также можете использовать его с GNU
tar
следующим образом:Это создает файл tar.gz из всех файлов, имена которых не заканчиваются на .tar.gz
rsync
также принимает файлы с этим-0
параметром, как и некоторые другие. Ноxargs
это клей, который вы обычно используете для этого типа целей. Либо это , либоfind
«s-exec
особенность.источник
tar
Пример команды хороший один. Для большинства целей, тем не менее,-exec
лучше подходит.Если у вас нет подкаталога
тоже должно работать!
Но
это общий способ.
источник
В качестве дополнения, если вы используете bash-совместимую оболочку, вы можете использовать переменную GLOBIGNORE, чтобы исключить результаты из сопоставления с образцом. От мужчины:
В вашем конкретном случае:
Обратите внимание, что я запускаю эту команду в качестве вложенной оболочки (используя круглые скобки), чтобы не изменять переменную среды GLOBIGNORE моей интерактивной оболочки.
источник