Znajdowanie plików według nazw

11

Jak mogę przenieść wszystkie pliki o nazwach zgodnych z określonym wyrażeniem regularnym, rekurencyjnie w drzewie katalogów, do pojedynczego bufora z diodami?

Więc mogę zmienić nazwę / usunąć je wszystkie naraz?

iLemming
źródło
2
Czy rozważałeś już słowo „find-name-dired”? (Używa symboli wieloznacznych, a nie wyrażeń regularnych.)
Marco Wahl
2
Powinieneś przesłać to jako odpowiedź @MarcoWahl. Nie miałem pojęcia, że ​​dired może to zrobić!
Tyler
1
Biblioteka find-dired+.elzapewnia ulepszoną wersję polecenia find-name-dired. Akceptuje opcjonalne argumenty, które określają (1) minimalną i maksymalną głębokość wyszukiwania oraz (2) ścieżki do wykluczenia z wyszukiwania.
Drew

Odpowiedzi:

11

Dzika karta

Posługiwać się

M-x find-name-dired

aby uzyskać pliki zgodnie z symbolem wieloznacznym.

Przykład

Znajdź wszystkie pliki z sufiksem „org” w katalogu „~ / org /”. Wpisz następujące informacje

M-x find-name-dired
~/org
*org

i baw się dobrze.

Wyrażenie regularne

Posługiwać się

M-x find-dired

z odpowiednimi argumentami, aby uzyskać pliki zgodnie z wyrażeniem regularnym.

Przykład

Znajdź wszystkie pliki z sufiksem „org” w katalogu „~ / org /”. Wpisz następujące informacje

M-x find-dired
~/org
-regex ".*org$"

i baw się dobrze.

Marco Wahl
źródło
Czy to możliwe, aby zautomatyzować ten proces, gdzie automatycznie sprawdzać *orgbez ręcznego wprowadzania go
alper
Jeśli dobrze cię rozumiem, istnieje wiele możliwości. Np. Utwórz specjalne polecenie, używając polecenia (defun my-find-orgfiles () (Interactive) (find-name-dired "~ / myorgs /" "* org")) i umieść je w pliku init. Następnie użyj MET my-find-orgfiles RET. Lub nawet powiąż polecenie z klawiszem.
Marco Wahl
Czy my-find-orgfiles ()po „t” i „Q” // można zaznaczyć wszystkie i zastosować? @Marco Wahl
alper
2

Wyrażenie regularne

Aby użyć wyrażenia regularnego, możesz także spróbować find-lisp-find-dired. To polecenie należy do standardowej biblioteki lib. find-lisp , który jest w całości napisany w elisp, tzn. nie musisz instalować zewnętrznego findprogramu.

Na przykład poniżej pokazano wszystkie pliki z rozszerzeniem „.el” w katalogu ~ / lisp:

M-x find-lisp-find-dired RET ~/lisp RET \.el\' RET

(Mecz honoruje case-fold-search).

Dzika karta

Warto zauważyć, że od następnej wersji Emacsa (v26.1) Dired obsługuje wilcards w części katalogowej argumentu nazwy pliku. Oznacza to, że następujące prace:

C-x d ~/soft/*/*.c RET

(W dopasowaniu rozróżniana jest wielkość liter).

To polecenie pokazuje w buforze Dired wszystkie pliki z rozszerzeniem „.c”, 2 poziomy głębi w „~ / soft” . Oznacza to, że zostaną wyświetlone wszystkie pliki, takie jak „~ / soft / foo / bar.c” , ale nie pliki takie jak „~ / soft / qux.c” ani „~ / soft / foo / baz / qux.c” .

To samo, ale bez rozróżniania wielkości liter:

C-x d ~/soft/*/*.[cC] RET

Premia

Jeśli używasz Dired z literą „ls” zaimplementowaną w elisp, „ls-lisp” lub „eshell-ls”, możesz rekurencyjnie wyświetlić listę wszystkich plików pasujących do znaku wieloznacznego o następującej składni:

C-x d ~/soft/**/*.c RET

Zanotuj '**'. W takim przypadku wyświetlane są wszystkie pliki w polach „ ~ / soft” pasujące do symbolu wieloznacznego, nawet „~ / soft / qux.c” .

Jednak podczas korzystania insert-directory-program z symboli wieloznacznych rozszerzenie jest dokonywane przez powłokę systemową; oznacza to, że ta rekurencyjna składnia „**” działa tylko, jeśli jest obsługiwana przez powłokę. Na przykład zsh go obsługuje, ale bash nie. W przypadku powłok innych niż zsh poprzednie polecenie zrobi to samo co:

C-x d ~/soft/*/*.c RET
Tino
źródło