Перечисление всех файлов в каталоге с расширением .bar, но без расширения .foo.bar - PullRequest
2 голосов
/ 01 февраля 2012

Я хочу использовать команду ls для вывода списка всех файлов в каталоге a с расширением .bar, но без расширения .foo.bar.Следующее подбирает .foo.bar файлы, которые мне не нужны

ls -l some/path/*.js

Должно быть просто.Мне просто нужно И, а НЕ как-то там.

Ответы [ 4 ]

4 голосов
/ 01 февраля 2012

Используя bash расширение пути с [ сопоставлением с образцом, вы можете написать:

ls -l some/path/*[!(.foo)].bar
1 голос
/ 01 февраля 2012

Я знаю, что вы спрашивали, как это сделать в bash, но в zsh вы могли бы сделать

ls -l *.bar~*.foo.bar

И вы получите все .bar файлы, которые не называются .foo.bar.Я думаю, это еще одна причина, чтобы перейти к zsh:)

1 голос
/ 01 февраля 2012

Если ваш запрос соответствует ab.js и cd.js, но не ef.tk.js, вы можете использовать следующий код. Это решает 2 проблемы:

  • нет проблем с пробелами в пути или именах файлов (например, файлы находятся в '/ var / tmp / my dir')
  • нет проблем с точками в имени пути (например: файлы находятся в /var/tmp/my.dir)

Если «DIR» - это каталог, в котором вы хотите найти свои файлы, а «EXT» - это шаблон, который вы пытаетесь найти, используйте:

find DIR  -regex '.*/[^./]*\.PAT' -print0 | xargs -0 -r ls -l

Например, если DIR равен '/ var / tmp', а PAT равен 'js' (для * .js):

find /var/tmp -regex '.*/[^./]*\.js' -print0 | xargs -0 -r ls -l

Это решение работает, если целевым каталогом является '/ var / tmp / my dir' (не забудьте затем поместить каталог в кавычки или не использовать пробел)

Если у вас много файлов, вы можете столкнуться с ограничением длины командной строки. Тогда вы можете вместо этого использовать 'xargs -0 -L XXX ls -l', поэтому каждый вызов ls будет выполняться только с файлами XXX max (например, используйте 500 для XXX).

1 голос
/ 01 февраля 2012
find -name '*.bar' -not -name '*.foo.bar'
...