2012-11-30 3 views
2

find-name-dired를 사용하여 모두 동일한 이름 (foo.txt라고 함)이 있지만 다른 디렉토리에있는 파일의 여러 인스턴스를 찾습니다. 나는 파일 경로의 알파벳 순서로 나열된 파일을 원한다. 그러나, 그들은 무작위 순서처럼 보이는 것에 열거되어 있습니다. dired-sort-menu이나 dired-sort-chiesa도 find-name-dired의 출력을 정렬합니다 (형식이 매우 비슷해 보이는 다른 dired 버퍼에서 작동하더라도). dired 버퍼의 내용을 파일에 쓰면 쉘을 열고 9 번째 필드 (경로)를 키로 사용하는 쉘의 sort 명령에 파일을 제출할 수 있습니다. 이것은 겉으로 보이는 출력을 생성하지만, 더 이상 dired 버퍼가 아닙니다. 전체 경로로 dired의 파일 정렬

인가가 난 그 외부 적으로 정렬 된 파일에

  1. 읽기 및 dired "모드"(편집 모드와 유사)을 열 수있는 방법,
  2. 정렬 이름-dired 찾을의 출력 여전히 dired 모드에 있거나
  3. 은 처음부터 원하는 방식으로 정렬 된 find-name-dired의 출력을 생성합니까?

UPDATE :

그냥 좀 더 구체적인, 여기에 현재의 버퍼의 일을 할 : (대부분의 dired 버퍼를 정렬 할 것이다)

/home/afrankel/Documents/emacs_test/: 
find . \(-iname foo.txt \) -exec ls -ld \{\} \; 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 a/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 b/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 d/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 c/z/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 c/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 f/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 e/foo.txt 

find finished at Fri Nov 30 17:00:41 

"s"를 누르면 오류를 제공 "할 수 없습니다 이 dired 버퍼를 정렬 "하십시오.

내가 버퍼는 다음과 같이 할 :

/home/afrankel/Documents/emacs_test/: 
find . \(-iname foo.txt \) -exec ls -ld \{\} \; 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 a/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 b/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 c/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 c/z/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 d/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 e/foo.txt 
-rw-r--r-- 1 afrankel users  4 Nov 30 16:59 f/foo.txt 

find finished at Fri Nov 30 17:00:41 
+1

파일을 검색 할 수없는'find-name-dired'가 아니라'dired-find-file'을 사용한다고 가정합니다. – pmr

+0

네, 고마워요! 그에 따라 내 질문을 편집했습니다. – Alan

답변

0

필자는 새로운 래퍼 함수 (find-name-dired-sorted)를 실행하고 defadvice를 사용하여 find-ls-option의 값을 자동으로 변경 한 다음 다시 변경하는 방법을 알아 냈습니다. 원래 값으로 되 돌린다.

(defadvice find-name-dired (around find-name-dired-around) 
    "Advice: Sort output by path name." 
    (let ((find-ls-option (list "-exec ls -ld {} \\; |sort --key=9"))) 
    ad-do-it)) 

(defun find-name-dired-sorted (dir pattern) 
    "Sort the output of find-name-dired by path name." 
    (interactive 
    "DFind-name (directory): \nsFind-name (filename wildcard): ") 
    (ad-activate 'find-name-dired) 
    (find-name-dired dir pattern) 
    (ad-deactivate 'find-name-dired)) 
3

당신이 "정상"Dired 버퍼에 를 입력하면, Dired 실제로 버퍼를 정렬하지 않습니다. 그것은 dired-actual-switches의 값을 변경하여 -t 옵션 ("수정 시간순으로 정렬")을 포함하거나하지 말고 revert-buffer을 호출하여 새로운 옵션으로 ls을 다시 실행합니다. 이것은 분명히 find을 실행하여 생성 된 Dired 버퍼에서 작동하지 않습니다. 당신이

(setq find-program "find -s") 
+0

유망한 것으로 들리지만 내게는 효과가 없었습니다. 내 "find"명령은 "-s"는 알려지지 않은 술어이고 "man find"는 "-s"스위치를 언급하지 않는다고 말했습니다. "남자"는 약속 한 것을 열거하지도 않았다. 나는 아직도 찾고있다. – Alan

+1

"-s"스위치는 Linux 버전이 아닌 "찾기"의 Mac OS X 버전에만 존재합니다. – Alan

+1

죄송합니다! (하지만 맥 오에스텐 일뿐만 아니라 FreeBSD도 마찬가지다.) 다른 답변의 해결책은 나에게 잘 어울린다. –

0

을 평가하여 (모든 find-dired 명령에 대해) 할 수있는 여기에 한 가지 방법은

-s  Cause find to traverse the file hierarchies in lexicographical 
     order, i.e., alphabetical order within each directory. 

입니다 :

당신이 대신해야 할 것은 -s 옵션을 find을 실행하는 데 준비하는 것입니다 구성에 대한 임시 변경을 통해 수동으로 수행하려면 다음을 수행하십시오.

  1. M-x customize-group find-dired를 실행하십시오.
  2. "Ls 옵션 찾기"필드의 내용을 변경하십시오. 처음에 "-exec ls -ld {} \;"를 읽어야합니다. 텍스트를 추가하여 "-exec ls -ld {} \; | sort --key = 9"로 읽습니다. 즉, 단일 문자열로 취급되는 전체 경로 인 필드 9로 정렬하십시오.
  3. 현재 세션에 대해서만 옵션을 설정하십시오.

업데이트 : 다른 (나중에) 답변에서와 마찬가지로 defadvice를 사용하는 것이 좋습니다.

+0

주위의 조언을 사용하여 더 깔끔하고 효율적으로 구현할 수 있습니다. – Alan

관련 문제