Chcę znaleźć wszystkie pliki według długości nazw plików.
Na przykład, jeśli chcę znaleźć pliki o długości 1, takie jak a.go
, b.go
.
Włożyłem:
grep '.\{1\}' file
Ale to nie działa. Jakiego polecenia mogę użyć do znalezienia plików według długości nazwy pliku?
a.go
to nazwa pliku o długości 4.a
to nazwa pliku o długości 1. To jest Uniks, a nie DOS, gdzie nazwa i rozszerzenie były osobne, a domniemana.
zawsze była częścią nazwy pliku.Odpowiedzi:
grep
szuka wzorców w zawartości plików. Jeśli chcesz spojrzeć na nazwy plików, możesz po prostu użyć powłoki glob (jeśli chcesz wziąć pod uwagę tylko nazwy plików w bieżącym katalogu):(Nawiasem mówiąc, to powłoka ocenia glob, a nie
echo
polecenie).Jeśli chcesz przeglądać katalogi rekurencyjnie, zaczynając od bieżącego katalogu, narzędziem do użycia jest
find
:(Pamiętaj, że musisz zacytować wzorzec, aby powłoka nie oceniła go jako globu przed
find
wywołaniem).źródło
Jeśli chcesz tylko znaleźć nazwy plików, możesz użyć następującego polecenia:
To się uruchomi
find
, ściągając nazwę pliku lub katalogu za pomocą,basename
a następnie wyszukuje nazwę pliku lub nazwę katalogu, która ma co najmniej 100 znaków. Jeśli chcesz znaleźć nazwę pliku o dokładnej długości, użyj{100}
zamiast{100,}
.Jeśli chcesz znaleźć nazwy plików, w tym ścieżkę, wykonaj następujące czynności:
Zwróci to nazwę pliku wraz ze ścieżką względną do miejsca, w którym uruchomiono polecenie find.
źródło
Po pierwsze,
grep
przeszukuje zawartość plików, nie szuka nazw plików. Do tego chceszfind
. Nie ma opcji ustawiania długości nazwy pliku, ale możesz przeanalizować jego wynik, aby uzyskać to, czego chcesz. Oto kilka przykładów, które uruchamiam w katalogu zawierającym następujące pliki:Wyszukiwanie plików w tym katalogu zwraca:
Aby znaleźć pliki o długości X, musimy usunąć ścieżkę i dopasować tylko znaki po ostatnim
/
:sed
Komenda tylko usuwa./
.-P
Flaga uaktywnia Perl Compatible Regular Expressions, które są potrzebne na{n}
co jest rzeczą PCRE i$
oznacza „dopasować koniec napisu”.Możesz również po prostu to zrobić:
To dobrze, jeśli małe liczby wpisujące 15 kropek w celu dopasowania nazw plików o długości 15 nie są zbyt wydajne.
Na koniec, jeśli chcesz zignorować rozszerzenie i dopasować tylko nazwę pliku, zrób to (zgodnie z sugestią @slm):
Jednak znajdzie to również pliki takie jak
a.bo.go
. Jest to lepsze, jeśli twoje nazwy plików mogą zawierać więcej niż jeden.
:UWAGA: Powyższe rozwiązanie zakłada, że masz względnie rozsądne nazwy plików, które nie zawierają nowych znaków wiersza itp. Będzie również liczyć nie ignorować spacji w nazwach plików podczas obliczania długości, która może być inna niż chcesz. Jeśli któryś z tych problemów stanowi problem, daj mi znać, a zaktualizuję odpowiedź.
źródło
Nie określasz, ale jeśli pliki mieszczą się w strukturze katalogów, możesz użyć
find
do zlokalizowania plików o długości 1 za pomocągrep
:Przykład
źródło
ggrep
: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Zrozum również, że to Q nie było oznaczone jako OSX, więc użyciegrep
jest poprawne.Użyłbym czegoś takiego.
Więc jeśli wstawisz dwa „?” to szukasz nazw plików z dwoma znakami i rozszerzeniem.
źródło
Jeśli chcesz użyć wyrażenia regularnego w poleceniu find, powinieneś użyć
""
takich jak:w takim przypadku użyj:
Powinieneś zastąpić swoją prawdziwą ścieżkę swoją ścieżką,
-a
oznaczaAnd
-type f
to, że szukasz tylko zwykłych plików.?
w zapytaniu oznacza jeden charachter, taki jak DOS, jeśli pamiętasz.źródło
ls ?.*
powinno dać pożądane rezultaty.źródło