Привет, кто-нибудь может мне помочь со следующей строкой:
find . \( -type d ! -name . -prune \) -o -type f -name "*Log*"
По сути, он должен найти каталоги, в которых присутствуют файлы, содержащие в имени слово «Log».
У меня такая структура:
/logs
|
|
----folder1
| |
| |
| ---App1LogDate.txt
|
----folder2
| |
| |
| ---App2LogDate.txt
|
|
|--App3LogDate.txt
|
|--App4LogDate.txt
Итак, если я запущу эту строку в каталоге /logs, я должен получить следующие результаты:
.
./folder1
./folder2
Всего 3 каталога.
решение1
Немного необычно, но, основываясь на вышеприведенном описании, следующее должно сделать именно то, что вам нужно:
find . -type f -name "*Log*" -print | sed -E 's/\/[^\/]+$//' | sort | uniq
решение2
find . -name *.Log -print
Это даст полный путь ко всем файлам, имена которых заканчиваются на Log.
решение3
найти . ( -тип d ! -имя . -prune ) -o -тип d -имя "Бревно"
tmp$ ls
App3LogDate.txt App4LogDate.txt folder1 folder2
tmp$ ls folder*
folder1:
App1LogDate.txt
folder2:
App2LogDate.txt
tmp$ find . \( -type d ! -name . -prune \) -o -type d -name "*Log*"
./folder2
./folder1
tmp$
решение4
Если у вас есть GNU find (как в Linux и многих других современных Unix-системах), вы можете просто воспользоваться замечательным оператором printf и сделать следующее:
find -type f -name '*Log*' -printf '%h\n'
Вы, вероятно, также захотите передать это через sort -u
(или через sort | uniq
, в зависимости от ситуации). Обратите внимание, что некоторые коммерческие реализации UNIX будут иметь это установленным как gfind (или иметь пакет, который устанавливает это как таковой).