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ę!


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

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' \)

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”.


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}

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)$'


0

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

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.