Jaki jest odpowiednik DOS „nazwa pliku dir / s / b” dla systemu Linux?

17

Wyświetl wszystkie pliki / katalogi w bieżącym katalogu lub poniżej, które pasują do „filename”.

mackenir
źródło

Odpowiedzi:

28

Bezpośrednim odpowiednikiem jest

find . -iname <filename>

która wyświetla listę wszystkich plików i katalogów wywoływanych <filename>w bieżącym katalogu i wszystkich podkatalogach, ignorując wielkość liter.

Jeśli twoja wersja Find nie obsługuje -iname, możesz -namezamiast tego użyć . Pamiętaj, że w przeciwieństwie do -iname, -namerozróżniana jest wielkość liter.

Jeśli chcesz tylko wyświetlić listę nazwanych plików <filename>, a nie katalogów, dodaj-type f

find . -iname <filename> -type f

Jeśli chcesz używać symboli wieloznacznych, musisz umieścić wokół nich cudzysłowy, np

find . -iname "*.txt" -type f

w przeciwnym razie powłoka ją rozwinie.

Jak zauważyli inni, możesz także:

find . | grep "\.txt$"

grep wypisze linie na podstawie wyrażeń regularnych, które są potężniejsze niż symbole wieloznaczne, ale mają inną składnię.

Zobacz man findi man greppo więcej szczegółów.

Mikel
źródło
3
Jeśli <filename>zawiera symbole wieloznaczne, użyj cudzysłowów wokół niego, np find . -name '*.txt'.
Gilles „SO- przestań być zły”
@Gilles, zaktualizowałem moją odpowiedź, żeby to powiedzieć, dzięki.
Mikel
2
Używanie <filename>jako znacznika dla userinput jest złym nawykiem w środowisku wiersza poleceń, w którym przez < and >większość czasu ma określone znaczenie. Sugeruję po prostu użyć filename, może FILENAME, aby to podkreślić. Większość ludzi zrozumie, a ci, którzy tego nie zrobią, mogą wyrządzić krzywdę, jeśli nie zrozumieją, że nie powinni uderzać mniej niż lub więcej niż znak.
użytkownik nieznany
2
<filename>jest konwencją w wielu dokumentacjach UNIX, więc myślę, że ludzie powinni być tego świadomi, ale zgadzam się, FILENAMEże może być łatwiejszy do zrozumienia.
Mikel
1
find -iname <filename>jest lepszy, ponieważ nie uwzględnia wielkości liter, jak DOS
Agnel Kurian
8

Niektóre pociski pozwalają ls **/filename, co jest dość wygodne.

Shawn J. Goff
źródło
1
Słuszna uwaga. W najnowszych wersjach bash uruchamianie shopt -s globstar; echo **/filenamejest równoważne z find . -name "filename". Działa również w Zsh.
Mikel
To „ls ** / nazwa_pliku” jest w porządku, ale wydaje się, że nie idzie głębiej niż na jeden poziom katalogu.
Sopalajo de Arrierez
@ sopalajo-de-arrierez Jeśli to zrobisz shopt -s globstar, prawdopodobnie zadziała dla Ciebie. Globowanie rekurencyjne jest funkcją dostępną tylko w niektórych powłokach, a czasem nie jest domyślnie włączona.
Shawn J. Goff
Ops ... Rozumiem teraz, @ ShawnJ.Goff: shoptpolecenie włącza opcję globstar on. Teraz działa jak urok. Wielkie dzięki.
Sopalajo de Arrierez
4

Możesz to zrobić za pomocą

find . | egrep filename
Matten
źródło
1
Możesz to zrobić w jednym z find . -regextype posix-egrep -regex '.*filename.*'(nie wiem, czy ta egrepczęść jest ważna, ale użyłeś jej egrepw odpowiedzi, więc ją
załączyłem
Możesz, ale grep jest inny niż równoważne polecenie DOS. grepużywa wyrażeń regularnych, podczas gdy polecenie DOS używa symboli wieloznacznych powłoki.
Mikel
1
Pomyśl o tym, globusy powłoki również różnią się od symboli wieloznacznych DOS. Na przykład find . -name "*.*"nie zrobi tego, czego można oczekiwać od tła DOS. Globy są jednak wystarczająco blisko, aby można je było rozpoznać, podczas gdy wyrażenia regularne są zupełnie nową bestią.
Jander
Co robi *.*.*w nowoczesnym systemie dos, np. Windows cmd? Co *.*.*.*?
ctrl-alt-delor
0

Może to być również: tree -if </your/path>lub 'pwd'ścieżka

Michael Fatahov
źródło