「ls」は「find」演算子「-printf」に対応していますか?

「ls」は「find」演算子「-printf」に対応していますか?

このコマンドには、見つかったファイル/フォルダごとにユーザーが指定したメタデータを印刷するfind便利な演算子があります。-printfコマンドにそのようなオプションがありますかls

代わりに、興味のあるファイル名のリストを find代わりに提供することができますが、lsこれは即座に大きなハンマーを使用しているようです。興味のあるファイルはすでにありますが、実際には何も「見つける」ことはできません。

findまた、必要なファイルパスを追加できないため、パスを提供するのは難しいかもしれません。終わりコマンドfind 。コマンドfindにパスが必要です。今後演算子(または「述語」)。そのため、「xargs」は簡単には利用できません。

ありがとうスチールドライバー彼の答えのために。stat最初から始めれば、彼の使用が解決策になると思います。残念ながら、find出力を他のシステム(特に'sを使用して)から生成された同様の情報と比較する必要がありますprintf

find私が見つけた効果的なコーディングイディオムは次のとおりです。

# Option 1
Some Command \
| xargs -n 1 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'

# Option 2
Some Command | tr '\n' '\0' \
| xargs -0 -I{} find {} -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'

に基づいてムルのfindコメント、これはCygwinのGnuバージョンが4.9より前であり、述語を認識していないため、まだ作業を開始していないコードイディオムです-files0-from

Some Command | tr '\n' '\0' \
| find -files0-from - -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'

答え1

私が知っている限り、これは1のGNU実装には当てはまりlsませんがstat

たとえばstat、GNU Coreutilsはstat --printf '%n\t%y\t%s\n'必要なフィールドと区切り文字を提供しますが、私が知っている限り、日付/時刻形式の詳細な制御は提供しません。

ただしzsh、これがオプションの場合は、次のものを使用できます。zsh/statモジュール、必要な正確な出力で独自のシェル関数を定義することもできます。

zmodload -F zsh/stat b:zstat

mystat () {
  local f s ret=0
  for f do
    zstat -n -LF '%Y-%m-%d %H:%M' -H s -- $f &&
      printf '%s\t%s\t%s\n' $s[name] $s[mtime] $s[size] ||
      ret=$?
  done
  return $ret
}

あるいは、単純なPerlスクリプトを使用して目的を達成することもできます。lstat機能、例えば

mystat() {
  perl -MPOSIX -E '
    foreach $f (@ARGV) { 
      if (@s = lstat($f)) {
        say join "\t", $f, strftime("%Y-%m-%d %H:%M", localtime($s[9])), $s[7];
      } else {
        warn "$f: $!\n";
        $ret = 1;
      }
    }
    exit $ret;
  ' -- "$@"
}

それにもかかわらず、これは-printfGNU実装に固有のものです(findGNUコマンドが追加される数十年前に存在していましたが)。statGNU find4.9以降では、述語を使用して任意のパスリストを確実に渡すことができます-files0-from

mystat() {
  [ "$#" -eq 0 ] ||
    printf '%s\0' "$@" |
    find -files0-from - -prune -printf '%p\t%TY-%Tm-%Td %TH:%TM\t%s\n'
}

いずれにせよ、TABとNLはファイルパスのすべての文字と同じくらい有効であるため、出力を確実に解析できません(単純化できるタイムスタンプ形式%F %Rもタイムゾーン情報が不足しているためあいまいです)。

これらはすべてlstat()ファイルに対して操作を実行するため、そのタイプの場合シンボリックリンクこれは最終的に確認されるファイルではなく、シンボリックリンク自体に関する情報を報告します。代わりにこれを行うには(シンボリックリンクが解決された後に情報を報告するには)、GNUまたはGNUにstat()オプションを追加し、zsh statから削除し、ast-openのオプションを削除してスクリプトから置き換えます。-Lstatfind-Plslstatstatperl


¹中全開ls -PdZ '%(name)s\t%(mtime:time=%Y-%m-%d %H:%M)s\t%(size)s' -- "$@"(と同じ構文ですが実装されています)標準paxコマンドの場合)しかし、私が知っている限り、その項目はもはや維持されません。

²GNUはstdinで実行することを意味すると解釈されるため、stat呼び出されたファイルでも失敗します。 zsh(GNUより数年前)にはこの問題はなく、任意のファイル記述子で実行できます。-fstat()stat-f FDfstat()

関連情報