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.