Найти файлы в 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" из поиска, но я не могу понять, как каким-то образом добавить "-type d". Как я могу это сделать?

Благодарность!

Asken
источник

Ответы:

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

Я использую «not wholename», когда я просто ищу файл. -name проверяет фактическое имя файла, но -wholename проверяет полный путь. Итак, добавив игнорирование для теста к вопросу выше:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
Эндрю Лориен
источник