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

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.


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.


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

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

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.