Я хотел бы перечислить все файлы в папке , foldername
которые имеют расширение test
, atest
или btest
.
Моей непосредственной мыслью было бежать ls ./foldername/*.{a,b,}test
Это прекрасно работает, если нет ничего с расширением atest
, в этом случае я получаю ошибку zsh: no matches found: ./foldername/*.atest
.
Есть ли способ, которым я могу просто проигнорировать эту ошибку и распечатать файлы, которые существуют?
Мне нужно, чтобы это работало как в ZSH, так и в BASH.
/dev/null
?Ответы:
Лучше всего сделать это с
find
:источник
-maxdepth 1
, чтобы ближе подражатьls
поведению-maxdepth
это расширение GNU. Обратите внимание на 3 других различия с глобусами:find
будут включать в себя скрытые файлы, не сортировать список и не соответствовать именам файлов, которые содержат байты, не образующие допустимых символов (например,$'St\xe9phane.atest'
в локали UTF-8)В
{a,b,...}
это не глобальный оператор, это расширение скобки, которое сначала расширяется до:И каждый глобус расширяется индивидуально, и, если какой-либо глобус не совпадает, команда отменяется, как и следовало ожидать
zsh
(илиfish
;bash
вам нужнаfailglob
опция для получения аналогичного поведения).Здесь вы хотите использовать один глобус, который соответствует всем этим файлам, и отменять команду, только если этот глобус не соответствует ни одному файлу:
Вы не хотите использовать
nullglob
, как если бы ни один из глобусов не совпадал, он работал быls
без аргументов, поэтому перечислите текущий каталог.cshnullglob
лучше в этом отношении, поскольку он удаляет несовпадающие глобусы, но все равно отменяет команду, если все глобусы не совпадают.Вы не хотели бы использовать
nonomatch
, поскольку это дало бы вам нарушенное поведение,bash
которое было бы позором.Для альтернативы glob, которая работает как в, так
zsh
и вbash
, вы можете использовать глобусы ksh (set -o kshglob
inzsh
иshopt -s extglob
inbash
).Тогда вы бы сделали:
или:
Добавьте
failglob
опцию,bash
чтобы глобус не передавался буквально,ls
когда он не совпадает.См. Почему nullglob не используется по умолчанию? за дополнительной информацией.
источник
?(...)
или+(...)
для Баш.