Jak wykluczyć katalog w find. dowództwo
Próbuję uruchomić polecenie find
dla wszystkich plików JavaScript, ale jak wykluczyć konkretny katalog?
Oto find
kod, którego używamy.
for file in $(find . -name '*.js')
do
java -jar config/yuicompressor-2.4.2.jar --type js $file -o $file
done
30 answers
Użyj przełącznika prune, na przykład, jeśli chcesz wykluczyć katalog misc
dodaj {[3] } do polecenia find:
find . -path ./misc -prune -o -name '*.txt' -print
Oto przykład z wieloma katalogami:
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
Tutaj wykluczamy dir1, dir2 i dir3, ponieważ w wyrażeniach find
jest to akcja, która działa na podstawie kryteriów -path dir1 -o -path dir2 -o -path dir3
(jeśli dir1 lub dir2 lub dir3), a także type -d
. Dalsze działanie to -o print
, wystarczy wydrukować.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-27 15:30:06
Jeśli -prune
nie zadziała dla ciebie, to:
find -name "*.js" -not -path "./directory/*"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-06 04:03:31
Uważam, że następujące łatwiejsze do rozumowania niż inne proponowane rozwiązania:
find build -not \( -path build/external -prune \) -name \*.js
To pochodzi z rzeczywistego przypadku użycia, w którym musiałem wywołać yui-compressor na niektórych plikach generowanych przez wintersmith, ale pominąć inne pliki, które muszą być wysłane tak, jak jest.
Wewnątrz \(
i \)
jest wyrażenie, które będzie pasowało dokładnie. build/external
( będzie Nie pasował, jeśli zrobiłeś find ./build
, na przykład -- musisz zmienić go na ./build/external
w takim przypadku), i będzie, w przypadku sukcesu, unikaj przechodzenia przez cokolwiek poniżej. Jest to następnie zgrupowane jako pojedyncze wyrażenie z nawiasem ucieczki i poprzedzone {[7] } , co spowoduje, że find
pominie wszystko, co zostało dopasowane do tego wyrażenia.
Można zapytać, czy dodanie -not
nie spowoduje, że wszystkie inne pliki ukryte przez -prune
pojawią się ponownie, a odpowiedź brzmi nie. Sposób działania {[10] } polega na tym, że wszystko, co po jego osiągnięciu, pliki znajdujące się pod tym katalogiem są trwale ignorowane.
To także łatwy do rozszerzenia, aby dodać dodatkowe wykluczenia. Na przykład:
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-21 06:35:51
Jest tu pewne zamieszanie co do preferowanej składni pomijania katalogu.
Opinia GNU
To ignore a directory and the files under it, use -prune
ze strony podręcznika GNU find
Rozumowanie
-prune
zatrzymuje find
zstępowanie do katalogu. Samo podanie -not -path
nadal będzie spadać do katalogu pominiętego, ale -not -path
będzie false, gdy find
przetestuje każdy plik.
Problemy z -prune
-prune
robi to, co jest zamierzone, ale nadal są pewne rzeczy, którymi musisz się zająć podczas korzystania z niego.
-
find
drukuje przycinany katalog.- prawda to zamierzone zachowanie, po prostu nie zstępuje do niego. Aby uniknąć drukowania katalogu, użyj składni, która logicznie go pomija.
-
-prune
działa tylko z-print
i nie ma innych działania.-
NIEPRAWDA .
-prune
działa z każdą akcją z wyjątkiem-delete
. dlaczego nie działa z delete? aby-delete
zadziałało, find musi przejść przez katalog w kolejności DFS, ponieważ-delete
najpierw usunie liście, potem rodziców liści itp... Ale aby określić-prune
, aby mieć sens,find
musi uderzyć w katalog i przestać go malować, co wyraźnie nie ma sensu z-depth
lub-delete
on
-
NIEPRAWDA .
Wydajność
Ustawiłem prosty test trzech top upvoted odpowiedzi na to pytanie(zamienione -print
na -exec bash -c 'echo $0' {} \;
, aby pokazać inny przykład działania). Wyniki są poniżej
----------------------------------------------
# of files/dirs in level one directories
.performance_test/prune_me 702702
.performance_test/other 2
----------------------------------------------
> find ".performance_test" -path ".performance_test/prune_me" -prune -o -exec bash -c 'echo "$0"' {} \;
.performance_test
.performance_test/other
.performance_test/other/foo
[# of files] 3 [Runtime(ns)] 23513814
> find ".performance_test" -not \( -path ".performance_test/prune_me" -prune \) -exec bash -c 'echo "$0"' {} \;
.performance_test
.performance_test/other
.performance_test/other/foo
[# of files] 3 [Runtime(ns)] 10670141
> find ".performance_test" -not -path ".performance_test/prune_me*" -exec bash -c 'echo "$0"' {} \;
.performance_test
.performance_test/other
.performance_test/other/foo
[# of files] 3 [Runtime(ns)] 864843145
Wniosek
Zarówno składnia f10bit jak i składnia Daniela C. Sobrala zajęła średnio 10-25ms. składnia GetFree, która nie używa -prune
, zajęła 865ms. więc tak, jest to dość ekstremalny przykład, ale jeśli zależy ci na czasie pracy i robisz coś zdalnie intensywnego, powinieneś użyć -prune
.
zauważ składnia Daniela C. Sobrala sprawdziła się lepiej z dwóch składni -prune
; ale mocno podejrzewam, że jest to wynik jakiegoś buforowania, ponieważ zmiana kolejności, w jakiej oba biegły, skutkowała odwrotnym rezultatem, podczas gdy wersja nie-prune była zawsze najwolniejsza.
Skrypt Testowy
#!/bin/bash
dir='.performance_test'
setup() {
mkdir "$dir" || exit 1
mkdir -p "$dir/prune_me/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/w/x/y/z" \
"$dir/other"
find "$dir/prune_me" -depth -type d -exec mkdir '{}'/{A..Z} \;
find "$dir/prune_me" -type d -exec touch '{}'/{1..1000} \;
touch "$dir/other/foo"
}
cleanup() {
rm -rf "$dir"
}
stats() {
for file in "$dir"/*; do
if [[ -d "$file" ]]; then
count=$(find "$file" | wc -l)
printf "%-30s %-10s\n" "$file" "$count"
fi
done
}
name1() {
find "$dir" -path "$dir/prune_me" -prune -o -exec bash -c 'echo "$0"' {} \;
}
name2() {
find "$dir" -not \( -path "$dir/prune_me" -prune \) -exec bash -c 'echo "$0"' {} \;
}
name3() {
find "$dir" -not -path "$dir/prune_me*" -exec bash -c 'echo "$0"' {} \;
}
printf "Setting up test files...\n\n"
setup
echo "----------------------------------------------"
echo "# of files/dirs in level one directories"
stats | sort -k 2 -n -r
echo "----------------------------------------------"
printf "\nRunning performance test...\n\n"
echo \> find \""$dir"\" -path \""$dir/prune_me"\" -prune -o -exec bash -c \'echo \"\$0\"\' {} \\\;
name1
s=$(date +%s%N)
name1_num=$(name1 | wc -l)
e=$(date +%s%N)
name1_perf=$((e-s))
printf " [# of files] $name1_num [Runtime(ns)] $name1_perf\n\n"
echo \> find \""$dir"\" -not \\\( -path \""$dir/prune_me"\" -prune \\\) -exec bash -c \'echo \"\$0\"\' {} \\\;
name2
s=$(date +%s%N)
name2_num=$(name2 | wc -l)
e=$(date +%s%N)
name2_perf=$((e-s))
printf " [# of files] $name2_num [Runtime(ns)] $name2_perf\n\n"
echo \> find \""$dir"\" -not -path \""$dir/prune_me*"\" -exec bash -c \'echo \"\$0\"\' {} \\\;
name3
s=$(date +%s%N)
name3_num=$(name3 | wc -l)
e=$(date +%s%N)
name3_perf=$((e-s))
printf " [# of files] $name3_num [Runtime(ns)] $name3_perf\n\n"
echo "Cleaning up test files..."
cleanup
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:54
Jedną z opcji byłoby wykluczenie wszystkich wyników, które zawierają nazwę katalogu z grep. Na przykład:
find . -name '*.js' | grep -v excludeddir
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 23:01:24
Wolę notację -not
... jest bardziej czytelny:
find . -name '*.js' -and -not -path directory
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-03 11:44:25
Użyj opcji-prune. Czyli coś w stylu:
find . -type d -name proc -prune -o -name '*.js'
'- type D-name proc - prune ' szuka tylko katalogów o nazwie proc do wykluczenia.
Operator'- o 'jest operatorem' lub'.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 23:07:40
Tylko ta mi pomogła.
find / -name NameOfFile ! -path '*/Directory/*'
Wyszukiwanie "NameOfFile" z wyłączeniem "Directory". Kłaść nacisk na Gwiazdy * .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-30 08:27:46
Jest to format, którego użyłem do wykluczenia niektórych ścieżek:
$ find ./ -type f -name "pattern" ! -path "excluded path" ! -path "excluded path"
Użyłem tego, aby znaleźć wszystkie pliki nie w "."ścieżki": {]}
$ find ./ -type f -name "*" ! -path "./.*" ! -path "./*/.*"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 17:06:19
-prune
zdecydowanie działa i jest najlepszą odpowiedzią, ponieważ zapobiega zejściu do katalogu, który chcesz wykluczyć. -not -path
który nadal przeszukuje wykluczony Katalog, po prostu nie wyświetla wyniku, co może być problemem, jeśli wykluczony katalog jest zamontowany na woluminie sieciowym lub nie masz uprawnień.
Najtrudniejsze jest to, że find
jest bardzo szczegółowe pod względem kolejności argumentów, więc jeśli nie zrobisz ich dobrze, twoje polecenie może nie działać. Kolejność argumentów jest generalnie jak takie:
find {path} {options} {action}
{path}
: Umieść najpierw wszystkie argumenty związane ze ścieżką, jak . -path './dir1' -prune -o
{options}
: największe sukcesy odnosiłem, umieszczając -name, -iname, etc
jako ostatnią opcję w tej grupie. Np. -type f -iname '*.js'
{action}
: będziesz chciał dodać -print
przy użyciu -prune
# setup test
mkdir dir1 dir2 dir3
touch dir1/file.txt; touch dir1/file.js
touch dir2/file.txt; touch dir2/file.js
touch dir3/file.txt; touch dir3/file.js
# search for *.js, exclude dir1
find . -path './dir1' -prune -o -type f -iname '*.js' -print
# search for *.js, exclude dir1 and dir2
find . \( -path './dir1' -o -path './dir2' \) -prune -o -type f -iname '*.js' -print
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-29 19:58:44
Podejście-path-prune działa również z symbolami wieloznacznymi w ścieżce. Poniżej znajduje się instrukcja find, która znajdzie Katalogi dla serwera git obsługującego wiele repozytoriów git, pomijając katalogi wewnętrzne git:
find . -type d \
-not \( -path */objects -prune \) \
-not \( -path */branches -prune \) \
-not \( -path */refs -prune \) \
-not \( -path */logs -prune \) \
-not \( -path */.git -prune \) \
-not \( -path */info -prune \) \
-not \( -path */hooks -prune \)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 04:05:44
Dla rozwiązania roboczego (testowane na Ubuntu 12.04 (Precise Pangolin))...
find ! -path "dir1" -iname "*.mp3"
Wyszukuje pliki MP3 w bieżącym folderze i podfolderach z wyjątkiem podfolderu dir1.
Użycie:
find ! -path "dir1" ! -path "dir2" -iname "*.mp3"
...aby wykluczyć dir1 i dir2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 19:20:38
Aby wykluczyć wiele katalogów:
find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" \)
Aby dodać katalogi, dodaj -o -path "./dirname/*"
:
find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" -o -path "./dir3/*"\)
Ale może powinieneś użyć wyrażenia regularnego , jeśli istnieje wiele katalogów do wykluczenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 19:21:32
Możesz użyć opcji prune, aby to osiągnąć. Jak na przykład:
find ./ -path ./beta/* -prune -o -iname example.com -print
Lub odwrotna opcja grep "grep-v":
find -iname example.com | grep -v beta
Szczegółowe instrukcje i przykłady znajdziesz w Linux find polecenie wyklucz katalogi z wyszukiwania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-25 10:48:24
Jest mnóstwo dobrych odpowiedzi, po prostu Zajęło mi trochę czasu, aby zrozumieć, do czego służy każdy element polecenia i logikę za nim stojącą.
find . -path ./misc -prune -o -name '*.txt' -print
Find rozpocznie wyszukiwanie plików i katalogów w bieżącym katalogu, stąd find .
.
Opcja -o
oznacza logiczny OR i oddziela dwie części polecenia:
[ -path ./misc -prune ] OR [ -name '*.txt' -print ]
Każdy katalog lub plik, który jest Nie.katalog / misc nie przejdzie pierwszego testu -path ./misc
. Ale będą testowane przeciw drugiemu wyrazowi. Jeśli ich nazwa odpowiada wzorcowi *.txt
, zostaną wydrukowane z powodu opcji -print
.
Kiedy find dotrze do ./ misc katalog, ten katalog spełnia tylko pierwsze wyrażenie. Tak więc zastosowana zostanie do niego opcja -prune
. Polecenie find nakazuje , a nie eksplorację tego katalogu. Więc każdy plik lub katalog w ./ misc nie będzie nawet badane przez find, nie będzie testowane z drugą częścią wyrażenia i nie będzie drukowane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 10:20:53
Używałem find
, aby podać listę plików dla xgettext
i chciałem pominąć konkretny katalog i jego zawartość. Próbowałem wielu permutacji -path
w połączeniu z -prune
, ale nie byłem w stanie całkowicie wykluczyć katalogu, który chciałem usunąć.
Chociaż udało mi się zignorować zawartość katalogu, który chciałem zignorować, find
następnie zwrócił sam katalog jako jeden z wyników, co spowodowało awarię xgettext
w wyniku (nie akceptuje katalogów; tylko plików).
Moim rozwiązaniem było po prostu użycie grep -v
, aby pominąć katalog, którego nie chciałem w wynikach:
find /project/directory -iname '*.php' -or -iname '*.phtml' | grep -iv '/some/directory' | xargs xgettext
Czy istnieje argument za find
, który zadziała w 100%, nie mogę powiedzieć na pewno. Używanie grep
było szybkim i łatwym rozwiązaniem po bólu głowy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-30 16:56:24
find -name '*.js' -not -path './node_modules/*' -not -path './vendor/*'
Wydaje się działać tak samo jak
find -name '*.js' -not \( -path './node_modules/*' -o -path './vendor/*' \)
I jest łatwiejsze do zapamiętania IMO.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 20:41:15
find . -name '*.js' -\! -name 'glob-for-excluded-dir' -prune
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 23:06:37
Żadna z poprzednich odpowiedzi nie jest dobra na Ubuntu. Spróbuj tego:
find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"
Znalazłem to tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:22:42
To jest dla mnie odpowiednie na Maca:
find . -name *.php -or -path "./vendor" -prune -or -path "./app/cache" -prune
Spowoduje wyłączenie katalogu vendor
i app/cache
dla nazwy wyszukiwania, która kończy się php
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 19:22:11
Dla tych z Was na starszych wersjach Uniksa, którzy nie mogą używać - path lub - not
Testowane na SunOS 5.10 bash 3.2 i SunOS 5.11 bash 4.4find . -type f -name "*" -o -type d -name "*excluded_directory*" -prune -type f
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-16 19:56:00
Jak-używać-prune-option-of-find-in-SH to doskonała odpowiedź Laurence Gonsalves na temat tego, jak -prune
działa.
A oto ogólne rozwiązanie:
find /path/to/search \
-type d \
\( -path /path/to/search/exclude_me \
-o \
-name exclude_me_too_anywhere \
\) \
-prune \
-o \
-type f -name '*\.js' -print
Aby uniknąć wielokrotnego wpisywania /path/to/seach/
, zawiń find
w parę pushd .. popd
.
pushd /path/to/search; \
find . \
-type d \
\( -path ./exclude_me \
-o \
-name exclude_me_too_anywhere \
\) \
-prune \
-o \
-type f -name '*\.js' -print; \
popd
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:49
Znalazłem nazwę funkcji w plikach źródłowych C exclude *.o i wyklucz *.swp i exclude (nie zwykły plik) oraz exclude dir output za pomocą tego polecenia:
find . \( ! -path "./output/*" \) -a \( -type f \) -a \( ! -name '*.o' \) -a \( ! -name '*.swp' \) | xargs grep -n soc_attach
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 19:23:00
Lepiej używać akcji exec
niż pętlifor
:
find . -path "./dirtoexclude" -prune \
-o -exec java -jar config/yuicompressor-2.4.2.jar --type js '{}' -o '{}' \;
exec ... '{}' ... '{}' \;
zostanie wykonane raz dla każdego pasującego pliku, zastępując klamry '{}'
bieżącą nazwą pliku.
Zauważ, że klamry są zamknięte w pojedynczych znakach cudzysłowu, aby chronić je przed interpretacją jako interpunkcja skryptu powłoki*.
Uwagi
* z sekcji przykłady strony man find (GNU findutils) 4.4.2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-15 14:19:02
Próbowałem komendy powyżej, ale żaden z tych używających "- prune " nie działa dla mnie. W końcu wypróbowałem to poleceniem poniżej:
find . \( -name "*" \) -prune -a ! -name "directory"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-12 08:56:05
Do tego czego potrzebowałem działało to tak, znajdując landscape.jpg
we wszystkich serwerach zaczynając od roota i wyłączając wyszukiwanie w katalogu /var
:
find / -maxdepth 1 -type d | grep -v /var | xargs -I '{}' find '{}' -name landscape.jpg
find / -maxdepth 1 -type d
lista wszystkich d irectories w /
grep -v /var
wyklucza ` / var " z listy
xargs -I '{}' find '{}' -name landscape.jpg
wykonaj dowolne polecenie, jak find
z każdym katalogiem / wynikiem z listy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 10:26:37
To działa, ponieważ find
testuje pliki dla wzorca "*foo*":
find ! -path "dir1" ! -path "dir2" -name "*foo*"
Ale to działa a nie działa, jeśli nie używasz wzoru (find
nie testuje pliku). Więc find
nie wykorzystuje swojej poprzedniej oceny " true" & "false " bools. Przykład niedziałającego przypadku użycia z powyższą notacją:
find ! -path "dir1" ! -path "dir2" -type f
Nie ma find
testów! Więc jeśli chcesz znaleźć pliki bez dopasowania wzorca użyj śliwki. Ponadto, dzięki użyciu prune find
jest zawsze szybsze, podczas gdy naprawdę pomija, że katalogi zamiast pasować do niego lub lepiej nie pasując do niego. Więc w takim przypadku użyj czegoś w stylu:
find dir -not \( -path "dir1" -prune \) -not \( -path "dir2" -prune \) -type f
Lub:
find dir -not \( -path "dir1" -o -path "dir2" -prune \) -type f
Pozdrawiam
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 11:44:32
Dla FreeBSD użytkowników:
find . -name '*.js' -not -path '*exclude/this/dir*'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 19:28:36
Jeśli katalogi wyszukiwania mają wzorzec (w moim przypadku najczęściej), możesz to zrobić tak jak poniżej:
find ./n* -name "*.tcl"
W powyższym przykładzie; przeszukuje wszystkie podkatalogi zaczynające się od "n".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-22 09:57:41
Znalazłem sugestie na tej stronie i wiele innych stron po prostu nie działa na moim systemie Mac OS X. Jednak znalazłem odmianę, która działa dla mnie.
[1]}Główną ideą jest przeszukiwanie Macintosha HD, ale unikanie przechodzenia przez wszystkie zewnętrzne woluminy, które są głównie backupami wehikułów czasu, kopiami obrazów, zamontowanymi udziałami i archiwami, ale bez konieczności odmontowywania ich wszystkich, co często jest niepraktyczne.Oto mój działający skrypt, który nazwałem "findit".
#!/usr/bin/env bash
# inspired by http://stackoverflow.com/questions/4210042/exclude-directory-from-find-command Danile C. Sobral
# using special syntax to avoid traversing.
# However, logic is refactored because the Sobral version still traverses
# everything on my system
echo ============================
echo find - from cwd, omitting external volumes
date
echo Enter sudo password if requested
sudo find . -not \( \
-path ./Volumes/Archive -prune -o \
-path ./Volumes/Boot\ OS\ X -prune -o \
-path ./Volumes/C \
-path ./Volumes/Data -prune -o \
-path ./Volumes/jas -prune -o \
-path ./Volumes/Recovery\ HD -prune -o \
-path ./Volumes/Time\ Machine\ Backups -prune -o \
-path ./Volumes/SuperDuper\ Image -prune -o \
-path ./Volumes/userland -prune \
\) -name "$1" -print
date
echo ============================
iMac2:~ jas$
Różne ścieżki mają związek z zewnętrznymi woluminami archiwów, wehikułem czasu, maszynami wirtualnymi, innymi zamontowanymi serwerami i tak dalej. Niektóre nazwy woluminów mają w sobie spacje.
Dobrym testem jest " findit index.php", ponieważ plik ten występuje w wielu miejscach w moim systemie. Dzięki temu skryptowi wyszukiwanie głównego dysku twardego zajmuje około 10 minut. Bez tych wyłączeń zajmuje to wiele godzin.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 15:33:16