Что не так с моей командой find exclude path?

#linux #shell #find

#linux #оболочка #Найти

Вопрос:

Моя папка

 app
data
node_modules
package.json
package-lock.json
server
 

Я хочу исключить node_modules

 find . -path node_modules -prune -o -type f -name "package.json"
 

и имя сераха на всех других путях.
Но я получил

 ./node_modules/postcss-pseudo-class-any-link/package.json
./node_modules/postcss-pseudo-class-any-link/node_modules/cssesc/package.json
./node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser/package.json
./node_modules/normalize-range/package.json
./node_modules/run-queue/package.json
./node_modules/regenerator-runtime/package.json
 

и так далее

Почему?

Ответ №1:

Используйте name вместо path . Кроме того, вы должны явно -print, чтобы избежать неявной печати удаляемого каталога.

 find . -name node_modules -prune -o -type f -name package.json -print
 

Обратите внимание, что ваше использование кавычек любопытно. Для согласованности мне кажется, что вам следует написать:

 find "." "-name" "node_modules" "-prune" "-o" "-type" "f" "-name" "package.json" "-print"
 

или даже

 "find" "." "-name" "node_modules" "-prune" "-o" "-type" "f" "-name" "package.json" "-print".
 

Если вы собираетесь процитировать один аргумент, вы можете также процитировать их все.