Решение на вынос:
ls -pd !(*.jpg) | grep -Ev /$
Шаблон глобуса не опускается в подкаталоги -. ls
делает :если вы передаете каталог в его командной строке, он отображает содержимое этого каталога.
Заменить ls
наecho
:
$ echo !(*.jpg)
Или (почти )эквивалентное решение :говорит ls
не спускаться в каталоги.
$ ls -d !(*.jpg)
Чтобы ответить на вопрос в комментариях :"как использовать команду ls для отображения только файлов, а не папок?" есть пара вариантов:
Краткий способ перечислить только каталоги:
echo */
Так что, возможно, ответ на список только файлов, а не каталогов может использоватьgrep -v
$ ls -p | grep -Ev /$
$ find. -maxdepth 1 ! -type d
Обратите внимание, что find будет перечислять точечные -файлы (скрытые файлы ). И find. -type d
будет (также )не переходить по символическим ссылкам.
Или прагматичный (posix )цикл:
$ for f in * ; do if [ -f "$f" ] ; then echo "$f" ; fi ; done
Конечно, конкретное решение для инвертированного расширения должно быть таким:
$ ls -pd !(*.jpg) | grep -Ev /$
11
111
112
1121
113
11a
11a1
1a1
1a2
1aa1.png
2a1
a.
a1a
a2a
aa
aa.gif
aa.png
aa.tiff
a.exe
a.gif
a.html
a.png
a.tiff
b2
b2a
ba.gif
ba.png
ba.tiff
b.html
cb1.png
d.gif
Опция -p вместе с grep позволяет идентифицировать каталоги,взгляните на справочную страницу ls:
-p, --file-type, --indicator-style=file-type
Да, это эквивалентно, но, очевидно, только если вы скажете mknod
на самом деле создать FIFO, а не блочное или символьное устройство (, что редко делается в наши дни, как devtmpfs/udev делает это за вас ).
mkfifo foobar
# same difference
mknod foobar p
В strace
одинаково для обеих команд:
mknod("foobar", S_IFIFO|0666) = 0
Таким образом, с точки зрения системных вызовов, mkfifo
на самом деле является сокращением для mknod
.
Таким образом, самое большое различие заключается в семантике. С помощью mkfifo
вы можете создать кучу FIFO за один раз:
mkfifo a b c
С mknod
, так как вы должны указать тип, он всегда принимает только один аргумент:
# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p
В общем, mknod
может быть сложно правильно использовать. Поэтому, если вы хотите работать с FIFO, придерживайтесь mkfifo
.
Они эквивалентны, за исключением крайних пределов переносимости. mknod... p
изначально был единственным способом создания именованных каналов, но POSIX решил опустить его и изобрел вместо него mkfifo
, по-видимому, потому, что именованные каналы по своей сути являются более переносимой концепцией, чем все другие вещи mknod
, которые можно делать с устройствами и их старшие и младшие числа. Системный вызов mknod
также был исключен из ранних версий POSIX.
Таким образом, для переносимости на древний UNIX mknod... p
лучше. Для современных систем mkfifo
немного лучше, хотя маловероятно, что вы найдете настоящий современный Unix, в котором mknod... p
не работает.