Odpowiedzi:
Aby uzupełnić istniejące odpowiedzi:
ls
Domyślnego narzędzia do listy katalogów ls
moż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ć tree
polecenie 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 tree
sam obsługuje symbole wieloznaczne.
ls
o wyświetlenie katalogu, otwiera go, to tak samo jak robiąc ls -l BirthdayPhotos
. Możesz ukryć to zachowanie za pomocą ls -d B*
.
B*
jako specyfikację katalogu?
B*
rozszerza się, aby pasowało do wszystkich katalogów, które zaczynają się od, B
więc naprawdę przekazujesz ls
listę katalogów, więc otwiera je wszystkie dla Ciebie.
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.
Możesz użyć find
polecenia 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 find
poleceniem wyszukiwania nazwy pliku za pomocą wzorca
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 ABC
tekstem.
Aby zrozumieć polecenie, podzielmy je nieco:
find
wyświetla wszystkie pliki w bieżącym katalogu i jego podkatalogach; użycie go samemu po prostu wyświetli wszystko. Zauważ, że find
wypisuje 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, ./ABC
a nie tylko ABC
.
Znak potoku |
przekierowuje dane wyjściowe jednej komendy do drugiej, w tym przypadku dane wyjściowe find
są przekierowywane na grep
. Nazywa się to orurowaniem.
grep
trwa wyjście i filtruje go za pomocą podanego wzorca, ^\./ABC
.
' '
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 grep
nie 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ść.)
find | grep
kiedy find
ma swoje całkowicie doskonałe możliwości dopasowywania wzorów?
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
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).
Następnie wpisz wyrażenie regularne ABC*
i sprawdź poprawność.
Każdy plik, którego nazwa pasuje do wzorca, zostanie automatycznie wybrany.
Używam Nautilus 3.6. * Z GNOME3 PPA na Ubuntu 12.10 (Quantal).
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"
Jeśli nie znasz katalogu, w którym ABC*
znajdują się pliki, i masz miliony plików, locate
polecenie 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:
find
polecenie zaczynające się w /
katalogu głównym będzie trwać bardzo długo i wygeneruje wiele błędów uprawnień.sudo updatedb
.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.
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 },".")'
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.
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 tr
nazwa 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
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:
Jak widzisz
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.
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
ls -l B*
, pokazuje zawartość wszystkich katalogów zaczynających się od, aB
nie tylko nazwy pasujących katalogów?