Как выбрать конкретные файлы в другом каталоге, используя bash?

13

Я хочу перечислить (или удалить, или выполнить какую-либо другую операцию) с определенными файлами в каталоге, например так:

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

Как я могу добиться этого (без предварительной записи в каталог)?

neu242
источник

Ответы:

22

Используйте фигурные скобки для этого:

ls /opt/somedir/{aa,bb,cc}

Для получения дополнительной информации читайте о расширении скобок .

порыв
источник
3

В bash запустите shopt -s extglob(или поместите его в свой ~/.bashrc), и вы сможете использовать дополнительные шаблоны, которые предоставляют регулярные выражения с необычным синтаксисом (унаследованным от ksh). Конечно, вы можете использовать эти шаблоны и в ksh, а также в zsh после setopt ksh_glob.

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

В Zsh вы можете напрямую использовать (foo|bar)в качестве шаблона.

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Обратите внимание, что команда вызывается с полным путем. Если вы хотите вызвать команду с коротким путем, вам нужно как-то изменить каталог, и (cd /opt/somedir && somecommand aa bb cc)это самый простой способ.

Жиль "ТАК - прекрати быть злым"
источник
Если вы присмотритесь, вы увидите, что я укажу «без записи в каталог сначала» в моем вопросе;)
neu242
1

Вы можете фильтровать, используя egrep:

ls | egrep '(aa|bb|cc)'

Чтобы найти все текстовые файлы:

ls | egrep '(aa|bb|cc).txt'
Океан
источник
1
точка будет соответствовать каждому символу, и этот подход затруднит дальнейшую работу с этими файлами
enzotib
1
Мне показалось, что ls тоже была просто примером команды.
Random832
Да, вы правы, я указал, что хочу выполнить операцию: перечисление файлов было только примером.
neu242
Хорошие комментарии, дорогие друзья, спасибо. Удачи neu242: D
Океан
1

Во-первых, я направляю вас: никогда не разбирайте , никогда . Правильный и канонический способ сделать то, что вы хотите, это найти .

Например:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

Я обычно использую -nameвместо того, -regexкак это проще. Но регулярное выражение подходит для вашего случая использования. Вы должны выполнить команду без -exec первого раза, чтобы убедиться, что это действительно те файлы, которые вы хотите переместить / удалить.

Спенсер Рэтбун
источник
Я никогда не говорил, что разберусь, и у Раша был гораздо лучший ответ. Спасибо за попытку, хотя :)
neu242