Uzyskaj rekurencyjne nazwy plików w wierszu polecenia

19

Natknąłem się na małą przeszkodę, próbując rekurencyjnie uzyskać tylko nazwy plików (bez rozszerzeń i ścieżek plików). To działało dla mnie w folderze głównym:

dir /b

Ale kiedy dodałem / s, aby skanować rekursywnie, otrzymałem również ścieżki do plików przed nazwami plików, których nie chcę. Czy istnieje sposób na uzyskanie nagich nazw plików ze wszystkich podfolderów w katalogu?

Im w systemie Windows 7 x64 Wolę używać zwykłego wiersza polecenia, a nie PS lub VBS

TMRW
źródło

Odpowiedzi:

15

Użyj następującego polecenia:

dir /b /a /s
  • / b usuwa datę i inne szczegóły z danych wyjściowych
  • / a wyświetla tylko nazwę pliku, bez ścieżek
  • / s włącza rekursywną listę katalogów

Jeśli chcesz zapisać dane wyjściowe w pliku, możesz użyć:

dir /b /a /s >> list_of_names.txt

EDYCJA Właściwie powyższe rozwiązanie nie osiąga pierwotnych celów pytania. Jedną z rzeczy, które zauważyłem w tym pytaniu, jest to, że post prosi o wpis rekurencyjny. której brakuje w drugiej odpowiedzi, więc myślę, że dodanie „/ s” w odpowiedzi drugiego użytkownika pozwoli załatwić sprawę

for /f %a in ('dir /b /s') do @echo %~na
Nik So
źródło
Czy możesz to wyjaśnić? Dla mnie to nie ma sensu.
Simon Sheehan,
4
To nie działa, / a nie działa w ten sposób - jest to filtr dla typu plików, które chcesz wyświetlić. Nie usuwa ścieżki z nazwy pliku podczas wykonywania rekurencyjnej listy katalogów.
Gaff
zredagował odpowiedź; i znów złapałem okno Windowsa, myślę, że tym razem powinien to zrobić (win732bit)
Nik So
6

Spróbuj tego:

for /f "delims=" %a in ('dir /b /s') do @echo %~na

Więcej informacji o tym, jak działa i co robi, wpisz for /?

Multiverse IT
źródło
To prawie działa, ale jest duży problem. Wyświetla tylko pierwsze słowo nazwy pliku. Jeśli nazwa pliku to na przykład „moje zdjęcie z wakacji 1”, to wyświetla tylko „moje”
TMRW
spróbuj tego: for / f "delims = |" % a in ('dir / b') do @echo% ~ na. Domyślnie parametr / f dla FOR tokenizuje spacje. Ustawienie tokena na znak, który nie powinien pojawiać się w nazwach plików / katalogów, da ci całą nazwę łącznie ze spacjami.
Scott McKinney
Jeśli chcesz, aby dane wyjściowe były wysyłane do pliku, dołącz>> filename.txt
Gruber
2
for /r %i in (*) do @echo %~ni

lub

forfiles /s /c "cmd /c if @isdir==FALSE noquotes.bat @fname"

zakładając plik noquotes.batw % PATH% z tą zawartością

@echo %~1

wyjaśniono podejście dla / r

for /rprzechodzi rekursywnie do bieżącego katalogu (można określić katalog for /r drive:\path\, przyjmuje się katalog bieżący) i wykonuje polecenie określone przez do dla każdego pliku dopasowanego w zestawie (*). Zestaw(.) pasowałby tylko do katalogów. @echo% ~ ni To polecenie działa tak, jak jest w wierszu polecenia. Podwój swoje cytaty, jeśli umieścisz je w pliku wsadowym. to znaczyfor /r %%i in (*) do @echo %%~ni

wyjaśniono podejście do plików

/swylicza bieżące i wszystkie podkatalogi
/cwykonują polecenie w cudzysłowie
@isdiri @fnamejest symbolem emitowanym do ciągu poleceń
Dodatkowy plik wsadowy noquotes.batpomaga, usuwając podwójne cudzysłowy z% ~ 1 (parametr 1),
forfilespozwala również określić ścieżkę, od której należy zacząćforfiles /P C:\Windows ...

JJS
źródło
@DavidPostill tak, to była zła odpowiedź. Dziękuję za komentarze. Daj mi znać, jeśli mogę jeszcze bardziej poprawić swoją odpowiedź.
JJS
@DavidPostill nie masz poprzedniej odpowiedzi ani komentarza. moderujesz pytania, czy szukasz odpowiedzi i potykasz się o moją słabą jakość odpowiedzi?
JJS
Twoja odpowiedź pojawiła się w kolejce recenzji „Posty niskiej jakości”. Ponieważ wiem dużo o plikach wsadowych, zająłem się tym.
DavidPostill
@DavidPostill dzięki za recenzję. Z zadowoleniem przyjmuję recenzję zmian, które wprowadziłem do mojej odpowiedzi.
JJS
Znacznie lepiej ... :)
DavidPostill
-1

Wyświetl wszystkie pliki, nagie, rekurencyjne, używając atrybutów (nie katalogu) (tylko pliki)

reż / B / S / A: -D

C: \ test \ cache> katalog / B / S / A: -D

C: \ test \ cache \ 7 \ 0f \ 7b50ed0522645513da90345120eaf0f7 C: \ test \ cache \ d \ 23 \ 814644aa6a8195c91e54d2f7bb64e23d

Brandon Hunt
źródło
Pytanie mówi, że OP „próbuje uzyskać tylko nazwy plików (bez rozszerzeń i ścieżek plików). … Ale kiedy [próbowałem dir /b /s] skanować rekurencyjnie, dostałem również ścieżki do plików przed nazwami plików, których nie chcę ”. Więc mówisz PO, aby wypróbował trywialną odmianę tego, co już wypróbował, a twoja odpowiedź pokazuje że daje taki sam wynik, jak podczas próby PO (tj. nie tego, czego chcą).
Scott