Как выбрать конкретные файлы в другом каталоге, используя 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

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

Ответы:



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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.