Як вибрати конкретні файли в іншому каталозі за допомогою 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)це, безумовно, найпростіший спосіб.


Якщо ви уважно подивитеся, то побачите , що я вказую «без CD-ки в каталог першого» в моєму питанні;)
neu242

1

Ви можете фільтрувати, використовуючи egrep:

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

Щоб знайти всі текстові файли:

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

1
точка буде відповідати кожному символу, і такий підхід ускладнює подальшу роботу над цими файлами
enzotib

1
У мене з'явилося відчуття, що ls також була лише прикладом команди.
Випадково832

Так, ви праві, я вказав, що хочу зробити операцію: перелік файлів був лише прикладом.
neu242

Гарні коментарі дорогі друзі, дякую. Удачі neu242: D
Ocean

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.