Знайдіть файли в Linux та виключіть конкретні каталоги


14

У мене є така знахідка:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

Я хотів би додати, щоб у знаходженні виключити каталог під назвою "test", але я не можу зрозуміти, як якось додати "-типу d". Як я міг робити це?

Спасибі!

Відповіді:


22

Ви можете скористатися -pathопцією, щоб знайти та поєднати її з -notоператором.

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Зверніть увагу на дві речі

  • -path має стати першим аргументом
  • шаблон відповідає всьому імені файлу, тому -path testнічого не буде відповідати ніколи

До речі, я не впевнений, чому ви використовуєте дужки, це не має значення. Він використовується лише для пріоритету, для таких конструкцій, як ! \( -name '*bla*' -name '*foo*' \)(тобто не знаходьте речі, які мають і те, blaі інше foo).

Подальше уточнення: не потрібно використовувати цикл bash, ви можете просто зробити

find . ... -exec cat {} \; -exec echo \;

де ... - інші аргументи find.


2
find / -path ./test -prune -o ...

Перейменуйте, ./testщоб відповідати розташуванню тестового каталогу.


2
У цьому випадку не забувайте додавати -print (тому що -print не є типовою дією) після опції -o
Білл Чжао

1

Ви можете спробувати з grep таким чином (тут папка названа test_folder):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

або якщо ваша знахідка повертає відносний шлях:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

або якщо ви хочете, щоб усі папки, що мають одне ім’я, але з різним шляхом

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

З повагою,


1

Щоб розширити те, на що, на мою думку, @CharlesClavadetscherйшов його відповідь. Якщо ви пропустите шлях -not -path ... find, продовжуйте спускатися зі шляху. Натомість використання не -pruneдозволить йому спускатися далі на пропущений шлях, зробивши його швидшим. Так ви можете зробити щось на кшталт

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

0

Я використовую "не повне ім'я", коли я просто шукаю файл. -name перевіряє власне ім'я файлу, але -name має тест на повний шлях. Тому додайте ігнор для тесту до вищезазначеного питання:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.