2

find-name-dired を使用して、すべて同じ名前 (foo.txt と呼びます) で異なるディレクトリにあるファイルの複数のインスタンスを検索しています。ファイルパスのアルファベット順にファイルをリストしたい。ただし、それらはランダムな順序で表示されます。dired -sort-menudired-sort-chiesaも、find-name-dired の出力をソートしませんが、他の dired バッファー (フォーマットは非常に似ています) では機能します。dired バッファーの内容をファイルに書き込むと、シェルを開いて、9 番目のフィールド (パス) をキーとして使用するシェル内のソート コマンドにファイルを送信できます。これにより、正しいように見える出力が生成されますが、もちろん、それはもはや dired バッファーではありません。

私ができる方法はありますか

  1. その外部でソートされたファイルを読み込み、それを dired "モード" (コンパイルモードに類似) で開きます。
  2. dired モードのままで find-name-dired の出力をソートする、または
  3. 最初から私が望むようにソートされた find-name-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 バッファーがソートされます)、「Cannot sort this dired buffer」というエラーが表示されます。

バッファを次のようにしたい:

/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
4

3 に答える 3

3

s「通常の」Dired バッファを入力すると、Dired は実際にはバッファをソートしません。dired-actual-switchesそれが行うことは、オプションを含む (または含まない) ようにの値を変更し-t(「変更時間で並べ替え」) 、新しいオプションrevert-bufferで再実行される which を呼び出すことです。lsこれは、 を実行して作成された Dired バッファでは明らかに機能しませんfind

find代わりに、次の-sオプションを使用して実行するように手配する必要があります。

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

評価することで(すべてのfind-diredコマンドに対して)できること

(setq find-program "find -s")
于 2012-12-01T12:16:30.423 に答える
0

設定を一時的に変更して手動で行う方法の 1 つを次に示します。

  1. Mx customize-group find-dired を実行します。
  2. フィールド "Find Ls Option" の内容を変更します。最初は「-exec ls -ld {} \;」と読む必要があります。"-exec ls -ld {} \; |sort --key=9" となるようにテキストを追加します。(つまり、フィールド 9 で並べ替えます。これは、単一の文字列として扱われるフル パスです。)
  3. 現在のセッションのみのオプションを設定します。

更新:他の(後で)回答したように、defadviceを使用することをお勧めします。

于 2012-12-01T18:33:29.070 に答える
0

さて、defadvice を使用して、新しいラッパー関数 (find-name-dired-sorted) の実行中に 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))
于 2012-12-02T17:22:26.890 に答える