Виключіть каталог у пошуку


11

Як я можу знайти кожен файл та каталог, що відповідають шаблону, за винятком одного каталогу за допомогою find?

Скажіть, у мене є така файлова структура;

.
  foo-виключити-мене /
    foo.txt
  foo-виключити-мені-не /
    foo.txt
  бар /
    foo.txt
    foobar /
      bar.txt
      foofoo.txt

як би я отримав такий результат, використовуючи find:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Я спробував використовувати обидві наступні команди:

знайти. -name 'foo-виключити-me' -prune -o -name 'foo *'
знайти. -name 'foo *' \! -path './foo-exclude-me/*'

але вони обидва повертають це:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Як я можу правильно виключити foo-exclude-meкаталог?


Спробуйте використовувати foo-exclude-meзамість ./foo-exclude-me. Спробуйте також додати -printв кінці команди.
n0pe

@MaxMackie perfect :)
Тайло

Це виправили? Яке виправлення працювало для вас? Я можу поставити це у відповідь замість коментаря.
n0pe

@MaxMackie, використовуючи і те, -printі foo-exclude-meзамість ./foo-exclude-me.
Тиїло

Дивовижно, схоже на те, що
Жилз

Відповіді:


11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

Без -print, неявна дія за замовчуванням застосовується до кожного матчу, навіть до обрізаних. Явне -printзастосовується лише за вказаних умов, які є -name 'foo*'лише в іншій галузі -name 'foo-exclude-me'.

Взагалі кажучи, використовуйте явний текст, -printколи ви робите щось складніше, ніж сполучення предикатів.

Ваша друга спроба з ! -path './foo-exclude-me/*'не вийшла, тому ./foo-exclude-meщо не відповідає ./foo-exclude-me/*(немає трейлінгу /). Додавання ! -path ./foo-exclude-meбуде працювати.


-2
-баш-4,1 $ знайти. -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r - r--. 1 oradba dba 499 18 січня 19:30 ./a.out
-rw-r - r--. 1 oradba dba 499 18 січня 20:59 ./b.out
-rw-r - r--. 1 oradba dba 499 18 січня 20:59 ./c.out
-rw-r - r--. 1 oradba dba 499 18 січня 20:59 ./d.out

.:
всього 16
-rw-r - r--. 1 oradba dba 499 18 січня 19:30 a.out
-rw-r - r--. 1 oradba dba 499 18 січня 20:59 b.out
-rw-r - r--. 1 oradba dba 499 18 січня 20:59 c.out
-rw-r - r--. 1 oradba dba 499 18 січня 20:59 d.out
rm: не можна видалити `. ': це каталог
ls: не вдається отримати доступ ./b.out: такого файлу чи каталогу немає
ls: не вдається отримати доступ ./d.out: такого файлу чи каталогу немає
ls: не вдається отримати доступ ./c.out: такого файлу чи каталогу немає
.:
всього 4
-rw-r - r--. 1 oradba dba 499 18 січня 19:30 a.out


Використовували варіант чорносливу, щоб пропустити a.out і працює чудово - art.s
user211226

Ви абсолютно не пояснюєте, чому -pruneце актуально. -prune- це один із найбільш суперечливих варіантів find"спричинити його відключення -print(який увімкнено за замовчуванням)
grochmal

-прін Правда; якщо файл - каталог, не спускайтеся в нього. - Тож воно не буде працювати в каталогах як захист. - art.s
користувач211226
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.