Jak wyszukać wszystkie pliki zaczynające się od nazwy „ABC” w katalogu?

58

Muszę wyszukać pliki zaczynające się od określonej nazwy. Może istnieć wiele plików zaczynających się od określonego wzorca i chcę wyświetlić listę wszystkich takich plików obecnych w katalogu.

R11G
źródło

Odpowiedzi:

60

Aby uzupełnić istniejące odpowiedzi:

ls

Domyślnego narzędzia do listy katalogów lsmożna używać w połączeniu z symbolami wieloznacznymi powłoki. Aby wyszukać wszystkie pliki ze wzorem abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

Pamiętaj, że rozszerzenie pliku ma również znaczenie dla wyników wyszukiwania.


tree

W przypadku, gdy musimy wyświetlić listę plików w drzewie katalogów, możemy również wydać treepolecenie wyszukiwania określonego wzorca, na przykład:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

W takim przypadku treesam obsługuje symbole wieloznaczne.

Takkat
źródło
2
Dlaczego, kiedy to robię ls -l B*, pokazuje zawartość wszystkich katalogów zaczynających się od, a Bnie tylko nazwy pasujących katalogów?
ErikE
@ErikE Ponieważ gdy poprosisz lso wyświetlenie katalogu, otwiera go, to tak samo jak robiąc ls -l BirthdayPhotos. Możesz ukryć to zachowanie za pomocą ls -d B*.
Azor Ahai
@AzorAhai Ale dlaczego traktuje to B*jako specyfikację katalogu?
ErikE
@ErikE Ponieważ użycie globu plików B*rozszerza się, aby pasowało do wszystkich katalogów, które zaczynają się od, Bwięc naprawdę przekazujesz lslistę katalogów, więc otwiera je wszystkie dla Ciebie.
Azor Ahai
1
Nie odpowiada na pytanie. ls -d ABC*o to pytał autor. Komentuje również we fragmencie kodu są złe, ls abc*wymienia zawartość katalogów zaczynających się ABC.
greatvovan
42

Możesz użyć findpolecenia do wyszukiwania plików ze wzorem

find . -type f -name "abc*" 

Powyższe polecenie przeszuka plik zaczynający się od abc w bieżącym katalogu roboczym.

-name 'abc'wyświetli listę plików, które są dokładnie dopasowane. Np .: abc

Możesz także użyć

 -iname
 -regex 

opcja z findpoleceniem wyszukiwania nazwy pliku za pomocą wzorca

devav2
źródło
7

Można to zrobić na wiele sposobów, w zależności od tego, co chcesz z nimi zrobić. Ogólnie rzecz biorąc, jeśli chcesz je tylko wyświetlić, możesz to zrobić w terminalu, używając:

find | grep '^\./ABC'

... i zastępując ABCtekstem.

Aby zrozumieć polecenie, podzielmy je nieco:

  • findwyświetla wszystkie pliki w bieżącym katalogu i jego podkatalogach; użycie go samemu po prostu wyświetli wszystko. Zauważ, że findwypisuje każdy plik lub katalog zaczynając od ./, wskazując, że ich ścieżka jest względem bieżącego katalogu. Świadomość tego jest ważna, ponieważ oznacza, że ​​będziemy szukać wyników zaczynając od, ./ABCa nie tylko ABC.

  • Znak potoku |przekierowuje dane wyjściowe jednej komendy do drugiej, w tym przypadku dane wyjściowe findsą przekierowywane na grep. Nazywa się to orurowaniem.

  • greptrwa wyjście i filtruje go za pomocą podanego wzorca, ^\./ABC.

    • Zauważ, że wzorzec jest cytowany z pojedynczymi cudzysłowami, ' 'aby uniemożliwić powłoce interpretację zawartych w niej znaków specjalnych.
  • Teraz sam wzorzec jest zapisany w określonej składni zwanej wyrażeniem regularnym lub w skrócie regex . Regex jest niezwykle potężnym narzędziem poszukiwania jeśli opanujesz ją, i istnieje miejsc, takich jak ten , który nauczy Cię o tym bardziej szczegółowo, ale należy pamiętać, że grepnie jest pełnoprawnym regex silnika i nie można zrobić wszystko, co z nim.

  • Do naszych celów:

    • ^in regex dopasowuje początek łańcucha; Zapobiega to dopasowaniu wzorca, jeśli nie występuje na początku nazwy pliku.

    • .regex ma również specjalne znaczenie: oznacza „dopasuj dowolny pojedynczy znak tutaj”. Jeśli chcesz użyć go jako dosłownej kropki, musisz „uciec” za pomocą ukośnika odwrotnego \. (Tak, dopasowanie dowolnej postaci byłoby w naszym przypadku nieszkodliwe, ale zrobiłem to ze względu na kompletność.)

Yamaho
źródło
1
Dlaczego miałbyś, find | grepkiedy findma swoje całkowicie doskonałe możliwości dopasowywania wzorów?
Darael,
3

możesz użyć GREP, myślę, że jest to najprostsze rozwiązanie, prawdopodobnie dodaj też inne parametry grep, aby dopasowanie było dokładniejsze

tree | grep ABC
Tomáš Tibenský
źródło
2

Możesz wyszukać określony wzorzec za pomocą menedżera plików Nautilus i wyrażeń regularnych.

Aby to zrobić, kliknij Wybierz elementy pasujące w menu Gear, jak poniżej (możesz również nacisnąć Ctrl+ s).

wprowadź opis zdjęcia tutaj

Następnie wpisz wyrażenie regularne ABC* i sprawdź poprawność.

wprowadź opis zdjęcia tutaj

Każdy plik, którego nazwa pasuje do wzorca, zostanie automatycznie wybrany.

wprowadź opis zdjęcia tutaj

Używam Nautilus 3.6. * Z GNOME3 PPA na Ubuntu 12.10 (Quantal).

remjg
źródło
1

Najłatwiejsze dla mnie rozwiązanie

ls | grep PATTERN

Tutaj możesz podać dowolne wyrażenie regularne we WZORZE.

Na przykład, aby znaleźć pliki z „ab” w dowolnym miejscu w jego nazwie, wpisz

ls | grep ".*ab.*"

Aby znaleźć pliki zaczynające się od „ab”, wpisz

ls | grep "^ab"
Preetom Saha Arko
źródło
1

Jeśli nie znasz katalogu, w którym ABC*znajdują się pliki, i masz miliony plików, locatepolecenie jest najszybszą metodą.

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

Uwagi:

  • Powyższe polecenie zajmuje 1 sekundę na milionie plików.
  • Dla porównania findpolecenie zaczynające się w /katalogu głównym będzie trwać bardzo długo i wygeneruje wiele błędów uprawnień.
  • Jeśli pliki zostały utworzone dzisiaj, musisz najpierw uruchomić sudo updatedb.
WinEunuuchs2Unix
źródło
0

używam

ls | grep abc

lub

ls -la | grep abc

Pokazuje wszystkie pliki z abc, nie tylko zaczynając od abc. Ale jest to dla mnie naprawdę łatwy sposób.

Mariano Cali
źródło
0

Pyton:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

Perl:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 
Sergiy Kolodyazhnyy
źródło
0
printf "%s" /path/to/files/ABC*

Jest to dopasowanie globalne, które jest zakotwiczone na obu końcach. Spowoduje to dopasowanie wszystkich wystąpień plików rozpoczynających się od „ABC”, takich jak „ABC”, „ABC.txt”, „ABC123”, ale nie „xABC”. Z wiersza poleceń używającego „ls” zamiast „printf” jest tutaj bezpieczna alternatywa, jednak w zależności od opinii, z którą się zgadzasz, „ls” nie jest bezpieczny do użycia w skrypcie. W takim przypadku użycie „printf” z dopasowaniem globalnym jest uważane za bezpieczne. Jeśli zamierzasz użyć tego w skrypcie, wynik „printf” nie będzie zawierał nowego znaku linii do końca strumienia wyjściowego jako takiego:

printf "%s" /path/to/files/ABC*  

Zwroty:

/path/to/files/ABC /path/to/files/ABC123

Jeśli potrzebujesz podziału linii po każdej instancji:

printf "%s\n" /path/to/files/ABC*

Zwroty:

/path/to/files/ABC 

/path/to/files/ABC123

„/ path / to / files /” pozostaje na wyjściu, jeśli wprowadzono go w ten sposób po uruchomieniu polecenia „printf”. Bez tego pojawia się tylko nazwa pliku:

printf "%s" ABC* 

Zwroty

ABC ABC123

Zakładając, że uruchomisz polecenie w katalogu, w którym istnieją pliki.

EnterUserNameHere
źródło
To echo /path/to/files/ABC* | tr " " "\n"nie jest dobry pomysł. Zastanów się, czy jest plik /path/to/files/ABC EFG, w nazwie pliku jest spacja. Twoja trnazwa pliku zostanie podzielona na dwie osobne linie, co nie jest dobre. Jeszcze gorzej, jeśli w nazwie pliku jest wiele spacji. Polecam użyć printf "%s\n" ABC*zamiast tego, co powinno pomóc w \n
spacjach
0

Command-t w jednej z moich ulubionych wtyczek vim, jest to wtyczka oparta na Ruby powyżej integracji z FZF.

Używając Comamnd-T i FZF, możesz wyszukiwać za pomocą bardzo szybkiego mechanizmu „rozmytego” dla:

  • Otwieranie plików i buforów
  • Przeskakując do tagów i pomocy
  • Uruchamianie poleceń lub poprzednich wyszukiwań i poleceń
  • z minimalną liczbą naciśnięć klawiszy.

Jak widzisz

wprowadź opis zdjęcia tutaj

Zawsze przeszukuję historię poleceń, otwierając nowy terminal i naciskając:

CTRL+R

Oprócz wyszukiwania we wszystkich folderach rekurencyjnie przez pisanie na dowolnej karcie terminala:

fzf

Następnie uruchom nazwę pliku

ABC

Możesz także pisać w środku vim

:CommandT 

Naprawdę pomocne, szczególnie w dużych folderach.

HMagdy
źródło
0

Załóżmy, że jestem w katalogu głównym i chcę tylko listę katalogu etc: piszemy,

find -type d -name "etc"

wynik, który otrzymujemy,

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

Inny przykład,

Możemy również napisać:

ls | grep "etc"

dostajemy

etc
Bhaskar Das
źródło