ls -altをreadlinkと組み合わせる

ls -altをreadlinkと組み合わせる

私は多くのシンボリックリンクと巨大なサブディレクトリを持つディレクトリを持っています。親ディレクトリにあるファイルの詳細リスト(時系列でソート)を取得したいがファイルがシンボリックリンクの場合は、リンクをターゲットに置き換えます。

このコマンドはreadlink -f * | sort | uniqシンボリックリンクを処理します。だからあなたは思うでしょう

ls -alt `readlink -f * | sort | uniq`

単にコマンド出力を時間でソートしますreadlink。ただし、親ディレクトリのコンテンツだけでなく、すべての子ディレクトリのコンテンツも返されます。目的の出力(時間ごとにソートされたリストなど)を取得する方法ただ親ディレクトリにファイルを保存し、リンクをターゲットに変更しますか?どんなアドバイスもありがとうございます。

ベストアンサー1

zshGNUを使用するとls

files=(*(NDoN:P))
(($#files)) && ls -ltd -- ${(u)files}

または、簡潔にするために匿名関数を使用してください。

(){ (($#)) && ls -ltd -- ${(u)@}; } *(NDoN:P)

N有効にしnullglobD dotglob隠しファイルを含め、mtimeベースの並べ替えをスキップしoN、GNUと同じことを行います。パラメータ拡張フラグは、配列から重複エントリを削除します。ls:Preadlink -f(u)

または、現在のディレクトリにファイルが多すぎると、上記の操作は失敗します。あまりにも議論するエラーが発生しました。zshリストを並べ替えて渡すとls -U(セルフソートを無効にするにはGNUまたは互換バージョンが必要です)、ls必要に応じてリストをより小さなチャンクに分割zargsできます。xargs

autoload zargs
files=(*(ND-om:P))
zargs -r --eof= -- ${(u)files} '' ls -lUd --

シンボリック-omリンクは、解決後の修正時間に基づいてソートされます。

(現在のブロックは、解決に無限ループを持つシンボリックリンクでzsh発生します。):P

GNUツールを使用すると、bash次のことができます。

shopt -s nullglob dotglob
files=(*)
((${#files[@]})) &&
  printf '%s\0' "${files[@]}" | # prints as NUL-delimited records
  xargs -r0 readlink -zf -- |   # get absolute canonical path
  LC_ALL=C sort -zu |           # removes duplicates
  xargs -r0 stat --printf '%.9Y/%n\0' -- | # get mtime with max precision
  sort -rnz |                   # sort numerically in reverse
  cut -zd/ -f2- |               # remove timestamp added earlier
  xargs -r0 ls -lUd --          # pass to as many ls invocations as needed

ファイルのリストが十分に小さい場合は、次のように単純化できます。

shopt -s nullglob dotglob
files=(*)
((${#files[@]})) &&
  readlink -zf -- "${files[@]}" | # get absolute canonical path
  LC_ALL=C sort -zu |             # removes duplicates
  xargs -r0 ls -ltd --            # pass to ls

NULで区切られたレコードでツール間でファイルのリストを常に渡す方法を学びます。 NULはファイルパスには現れない唯一の文字(およびバイト値)なので、唯一の安全なアプローチです。

では、readlink -f * | sort改行で区切られたレコードにファイルのリストを渡すため、改行readlinksort含むファイル名が破損します。また、--以前に出てきた名前を忘れてしまったので。*で始まるファイル名が壊れます。-

では、状況ははるかに悪いですls -alt `cmd`。今回は、出力がcmd空白、タブ、および改行(デフォルトとして仮定$IFS)に分割され、ファイル名の生成が結果の単語に対して実行されるため、より多くの文字がブロックされます。そうでない場合にもリストされます-dlsコンテンツこれは、ディレクトリ自体だけでなく、引数として渡されたディレクトリの一部です。

おすすめ記事