Staram się lista wszystkich plików z dir1
, dir2
, dir3
i dir4
które mogą być w dowolnym miejscu w podkatalogu mojego cwd
pomocą find
polecenia. Próbowałem następujących bezskutecznie:
find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'
Próbowałem posix-extended
też. Jak mogę wyświetlić te pliki?
bash
find
regular-expression
Aaron
źródło
źródło
Odpowiedzi:
A jeśli chcesz szukać trzy foldery o nazwie
foo
,bar
ibaz
dla wszystkich*.py
plików, użyj polecenia:find foo bar baz -name "*.py"
więc jeśli chcesz wyświetlić pliki z
dir1
dir2
dir3
użyciafind dir1 dir2 dir3 -type f
Spróbuj tego
find . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;
źródło
./dir
zamiastdir
./path/to/dir1
), W którym to przypadku./dir1
nie istniałby.Najlepiej jest użyć dyrektywy -path:
Co oznacza: znajdź wszystkie pliki w bieżącym katalogu, w których na ścieżce znajduje się „dir1” lub „dir2” lub „dir3” lub „dir4”.
źródło
-a
i-o
dla standardowego odpowiednika GNU-and
/-or
.Po prostu, aby wszyscy wiedzieli. Dodanie
.*/
przed każdymdir
rozwiązało problem, ponieważregex
wydaje się pasować do pełnej ścieżki.źródło
To mój pierwszy pomysł po przeczytaniu poprzednich odpowiedzi:
To bierze pod uwagę, że wyrażenie regularne musi pasować do całej nazwy pliku, i jest łatwiejsze do zrozumienia.
źródło
Próbka szybkiego (!) Znajdowania określonych plików (log_dostępu) w wielu lokalizacjach określonych przez symbol wieloznaczny (katalog domowy) i ogólny katalog logów apache2 z zastosowaniem filtrowania nazw w celu wykluczenia logów ssl i starych logów gzip. Nie odpowiada bezpośrednio na pytanie tutaj, ale może być przydatne dla kogoś, kto znalazł te instrukcje (jak ja).
Uważaj na spacje, szczególnie w pobliżu
\(
i\)
.Nawiasem mówiąc, użyłem go do apachetop, aby znaleźć najbardziej aktywne strony na moim serwerze.
źródło
nie musisz podawać nazwy katalog od katalog1 do katalog4, jeśli używasz wyrażenia regularnego
type f
: znajdź pliki, a nie katalogiregextype sed
: używa wyrażenia regularnego sedregex
: wyszukuje za pomocą wyrażenia regularnego na całej ścieżce".*/dir[1-4]/[a-z0-9]*"
:. * na początku oznacza dowolną liczbę znaków, które mogą być typu (char / number / backslash (/) itp.); dir [1-4] oznacza szukanie „dir”, po którym następuje liczba od 1 do 4; / [^ /] * stwierdza, że po dir1-4 pomija nazwy ścieżek, które zawierają /, więc zwraca tylko pliki z katalogu dir1-dir4 i ignoruje wszystkie podkatalogi, które mogą znajdować się w dir1-dir4.utworzyłeś katalog do przetestowania: https://github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017
źródło
red
,green
,blue
iyellow
czy mogą one byćJohn
,Paul
,George
iRingo
.) Twoja odpowiedź zakłada, że są one dosłowniedir1
,dir2
,dir3
idir4
. … (foo_bar
,foo.txt
iFOO
)? (4) Dlaczego twój tekst wyjaśnia,/[^/]*
kiedy twoja odpowiedź go nie używa?Wiem, że określiłeś, że używając find, ale tylko w celu pokazania innych opcji, których można użyć, możesz użyć xargs:
Możesz mieć plik o nazwie „foldery” zawierający coś takiego:
Następnie możesz zrobić coś takiego:
xargs, moim zdaniem, czuję się bardziej wszechstronny niż find -exec. Możesz także zrobić szalone rzeczy
źródło