Что такое команда для получения имени файла с любым символом, кроме нескольких?
Скажите, я не хочу, чтобы имя файла содержало буквы q и Q
ls [^ qQ] не работает. Что бы я сделал?
Если вы хотите использовать глобирование (это не всегда хорошая идея), вы можете использовать:
$ ls -d !(*[qQ]*)
или с shopt -s nocaseglob
:
$ shopt -s nocaseglob
$ ls -d !(*q*)
-d
опция, чтобы не отображать содержимое совпавших каталогов.
Чтобы это работало, у вас должно быть установлено extglob
, это, вероятно, имеет место по умолчанию. Если нет, то подойдет shopt -s extglob
.
Лучшим подходом было бы использовать find , так как вы сможете -exec
кое-что найти в подходящих файлах, если вам нужно (переименовать, grep , edit, и т. д.), и вы будете гораздо лучше контролировать то, что вам нужно. Пример:
$ find . -maxdepth 1 \! -iname '*q*' -type f
Это найдет все файлы (-type f
) в текущем каталоге (.
), а не в подкаталогах (-maxdepth 1
), у которых (\!
) нет [ 1115] q или Q в их названии (-iname '*q*'
).
Если у вас огромное количество файлов, найти лучше и быстрее, чем сглаживание Bash , и не будет превышать максимальное количество аргументов.
Надеюсь, это поможет!
Если удар, который включен расширенный globbing, то можно инвертировать соответствия с! (шаблон), например, если
$ touch aQq qwerty uiop asdfg bnmq
$
$ ls
aQq asdfg bnmq qwerty uiop
затем
$ ls !(*[qQ]*)
asdfg uiop
тогда как
$ ls *[qQ]*
aQq bnmq qwerty
Можно проверить текущее значение extglob использования опции shopt -p extglob
и набор это с shopt -s extglob
. Ввести help shopt
в ударе запрашивают больше информации.
Почему не просто
ls | grep -v [qQ]
Если вместо отдельных символов Вы хотите исключить имена файлов, содержащие определенные строки символов, Вы могли бы сделать так с
ls | grep -v "str1\|str2\|..."
т.е. разделяя любую строку с завершенным символом канала |
(который действует как "ИЛИ" логический оператор). Не забудьте включать его в двойные кавычки для предотвращения специальных символов, которые будут неправильно истолкованы.