このコマンドには、見つかったファイル/フォルダごとにユーザーが指定したメタデータを印刷する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;
' -- "$@"
}
それにもかかわらず、これは-printf
GNU実装に固有のものです(find
GNUコマンドが追加される数十年前に存在していましたが)。stat
GNU find
4.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のオプションを削除してスクリプトから置き換えます。-L
stat
find
-P
ls
lstat
stat
perl
¹中全開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 FD
fstat()