Rekurencyjnie znajdź pliki z określonym rozszerzeniem

81

Próbuję znaleźć pliki z określonymi rozszerzeniami. Na przykład chcę znaleźć wszystkie pliki .pdf i .jpg o nazwie Robert

Wiem, że mogę wykonać to polecenie

$ find . -name '*.h' -o -name '*.cpp'

ale muszę podać nazwę samego pliku oprócz rozszerzeń. Chcę tylko sprawdzić, czy istnieje sposób, aby uniknąć ciągłego wpisywania nazwy pliku. Dziękuję!

A1X
źródło
4
Każdy, kto kopiuje to polecenie lub dowolne poniżej, powinien użyć inamezamiast niego - co jest bez rozróżniania wielkości liter .
Addison
Słuszna uwaga, Addison (stąd +1). Wygląda jednak na to, że OP chce plików o nazwie „Robert” z dużym „R”. Ponieważ interpretuję post, oznacza to, że pliki zawierające słowo „robert” NIE powinny być wyprowadzane. Napisane jest " R obert". Są jednak sytuacje, w których ktoś chciałby znaleźć „Roberta” lub „Roberta”. Może PO jest w takiej sytuacji. Czy użyć, inameczy namezależy od tego, co chcesz znaleźć. Byłem w sytuacjach, w których sprawa była niezbędna.
bballdave025,

Odpowiedzi:

101

Moja preferencja:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert
Mglisty dzień
źródło
2
Działa ładnie, ale niewielką wadą jest to, że uniemożliwia ci zrobienie find -exec ...
czegoś
co zrobić, jeśli chcę znaleźć wszystkie pliki xxx-deployment.yml we wszystkich folderach w określonej ścieżce?
Naim Salameh
To nie działa tak dobrze, jeśli masz jpglub pngjako część dłuższej ścieżki.
AutonomousApps
18

Korzystanie find„s -regexargumentu:

find . -regex '.*/Robert\.\(h\|cpp\)$'

Lub po prostu używając -name:

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \)
Etan Reisner
źródło
4
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \)

-oRepreents o ORkondycję i można dodać tyle, ile chcesz w nawiasach. Oznacza to, że wszystkie pliki zawierające słowo „Robert” w dowolnym miejscu w ich nazwach i których nazwy kończą się na „pdf” lub „jpg”.

Mark Setchell
źródło
3

Jako alternatywa dla korzystania z -regexopcji onfind , ponieważ pytanie jest oznaczone, możesz użyć mechanizmu rozwijania nawiasów:

eval find . -false "-o -name Robert".{jpg,pdf}
jxh
źródło
znajdź raport "ścieżki muszą poprzedzać wyrażenie", w czym problem? Zwykle dodaję cytat, aby go rozwiązać, ale nie działam dla tego wyrażenia. Dzięki!
netawater
Podejrzewam, że albo zapomniałeś, evalalbo .w powyższym poleceniu, albo jesteś findaliasem do czegoś bardziej skomplikowanego, albo nie używasz podstawowego GNU findw swojej wersji Linuksa.
jxh
Dzięki za odpowiedź, użyłem takiego skryptu: FILEEXTEIONS = cs, [ch] eval find. -false "-o -name *". {$ FILEEXTEIONS} i zgłasza ten błąd.
netawater
O ile wiem, rozwijanie zmiennych nie będzie występowało wewnątrz nawiasów klamrowych.
jxh
1
Chciałem użyć tej techniki w powłoce Androida, ale jej findnie obsługuje -false. Pracowałem wokół to poprzez podanie dwóch wzajemnie ekskluzywne warunki są więc wspólnie fałszywa -inum 1 -inum 2.
starfry
1

Jako skrypt możesz użyć:

find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print
  • zapisz to jako findcc
  • chmod 755 findcc

i używaj go jako

findcc [name] [[search_direcory]]

na przykład

findcc                 # default name 'Robert' and directory .
findcc Joe             # default directory '.'
findcc Joe /somewhere  # no defaults

Zauważ, że nie możesz użyć

findcc /some/where    #eg without the name...

również jako alternatywę możesz użyć

find "$1" -print | grep "$@" 

i

findcc directory grep_options

lubić

findcc . -P '/Robert\.(h|cpp)$'
jm666
źródło
1

Używanie bash globbing (jeśli findnie jest konieczne)

ls Robert.{pdf,jpg} 
pewnego razu
źródło
0

Powtarzalnie z ls: (-al dla dołączania ukrytych folderów)

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
wuseman
źródło