find -exec lsの出力ソート

find -exec lsの出力ソート

ファイル名で出力をアルファベット順に並べ替えることはできますかfind … -exec ls -ls ;

これは私のcronコマンドです。

find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;

このコマンドはほとんどの場合にうまく機能します。ただし、結果は意味のある順序で並べ替えられません。ファイル名フィールドに基づいてソートすると非常に役立ちます。

答え1

あなたのファイル名に改行文字が含まれていないとします。

find /home/setefgge/public_html -type f -ctime -1 -exec ls -nls {} + | sort -k 10

呼び出しをバッチ処理する+のではなく、;シャットダウン操作を使用すると、作業が速くなる可能性があります。コマンドを使用してパイプラインを並べ替えることができます。 10番目のフィールドからソートを開始するように指示します(最初の9つのフィールドはメタデータです。ブロック、権限、リンク数、ユーザー、グループ、サイズ、および3つの日付/時刻フィールド)。このオプションは、ユーザーまたはグループ名にスペースが含まれるリスクを防ぐために、ユーザーとグループに数値を使用することを示します。-execlssort-nls

または、zshを使用すると、次のようにしてすべての名前の仮定を削除できます。グローバル予選ファイルの収集と並べ替えzargslsコマンドラインが長すぎる場合は、何度も実行してください。並べ替えを防ぐには、GNU ls(特にそのオプション)が必要です(代わりにzshを使用してシミュレーションすることです)-flslszstat)。

autoload -U zargs
zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf

答え2

ソートを介して検索結果を渡した後、各行に対してlsを実行するのはどうですか?

find . -type f -ctime -1 | sort | while IFS= read -r filename; do ls -ls "$filename"; done

答え3

POSIXは、ongリストの日付について次のように言いますls -l

この<date and time>フィールドには、ファイルが最後に変更された日付とタイムスタンプを含める必要があります。 POSIXロケールでは、このフィールドは次の日付コマンドの出力と同じでなければなりません。

date "+%b %e %H:%M"

...過去6ヶ月以内にファイルが変更された場合:

date "+%b %e %Y"

これを念頭に置いてファイル名に改行がある場合は、POSIX指定オプションを使用して正しく一致することを確認しても、ls -q結果の正規表現を準備するのは比較的簡単で、まったく必要ありません。lsfind

d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"

###OUTPUT###
Jul  5 Jul  4

grepこれを行うには、今日または昨日の日付を表す文字列を含む行のみを返します。次のコマンドはここに少しを追加します。

ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

lsオプションは次のとおりです。

  1. -a次に始まるファイルを含むディレクトリ内のすべてのファイルを返します。.dot
  2. -l長いリスト
  3. -Rすべてのサブディレクトリを再帰的に一覧表示
  4. -c接続時間の代わりに修正時間を表示
  5. -q?印刷できない文字やファイル名のab文字の代わりにシェルグローブを返します。\t

|pipeこの結果は一致するファイルにのみ渡されますsed

  1. パス名の前の空白行と次の行
  2. 次に始まる行- (つまり、dディレクトリでは機能しません)ここではあなたのdate
  3. ただし、名前付きディレクトリに実際にフィルタリングされたファイルが含まれていない場合、パス名の行は印刷されません。

出力は次のとおりです。

ls -alRcq --color=always | 
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv   2086 Jul  4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv   2657 Jul  4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv    681 Jul  5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul  5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul  4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul  4 13:34 shot-2014-06-22_17-11-06.jpg

./.cache/efreet:
-rw------- 1 mikeserv mikeserv  37325 Jul  4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv  37325 Jul  4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  16037 Jul  4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv   3117 Jul  4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul  4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv  18589 Jul  4 23:30 icons_hicolor_localhost.eet

./.config:
-rw-r--r-- 1 mikeserv mikeserv   30 Jul  4 19:10 pavucontrol.ini

./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul  4 13:36 conf.tar.lz4.bak

はい、それでも動作しますLS_COLORS。もちろん、これはあなたにとって低い優先順位ですが、cronオプションは開いています。

それにもかかわらず、これは他の可能な解決策に比べていくつかの重要な利点を提供する。

  1. まず、find+lsには複数の呼び出しが含まれます。これには1つのlsプロセスしか含まれていないため、すべてを安定して並べ替えます(デフォルトではそうです)。したがって、sort補助的な役割もあります。

  2. find関連していて実行中のすべてのsortソリューションlsみんな二度働きました。すべてのパス名とすべてのファイルを解析しlsます。そして、すべての結果がソートされます。 1つだけを使用するのが最善です。findstatlssortls

  3. もちろん、この答えにはand部分がありますdatesed注目すべき重要な点は、難しい部分を実行し、正規表現を最初に一度だけ取得し、結果を取得し、結果を取得し、結果をソートしてソートするのではなく、単一の結果リストをトリミングすることです。結果を並べ替えます。

  4. 他の解決策と同様に、改行文字を含むファイル名は破損しません。このソリューションには、次に説明する独自の注意事項がありますが、これは簡単で管理が簡単です。私の考えでは、これが最も強力なソリューションです。

上記のコマンドによって問題が発生する可能性がある2つの状況があります。最初は?ファイル名にglobを含みます。すでにここに提示されている他のソリューションよりも強力なソリューションであり、aが発生する可能性は?それ自体は十分に小さいですが、複数のファイル名と一致する可能性があるこれらのglobを確認できます。よりこれこのトピックに関する追加情報。

date別の可能性は偽の肯定に関連しています。たとえば、検索している文字列と実際に一致するファイル名がありますが、特定のgrep日付に実際には変更されていない場合です。これは問題ではないと思います。でも問題になったらお問い合わせください。この問題を処理するために正規表現をより具体的にするのに役立ちます。

答え4

実際にはfind、xargs、lsを組み合わせて使用​​できます。

以下はコマンドの例です。find . -type f -print0 | xargs -0 ls -lt

  • find現在のディレクトリ内のすべてのファイルが繰り返し検索されます。
  • lsxargsは、1回の呼び出しでこのファイルのリストをコマンドに渡します(ファイル数findよりも返されたファイル数が少ない場合)。ARG_MAX
  • ls -ltこのファイルは時間ごとにソートされ、出力形式が指定されます。

システムを検索するには、ARG_MAX次のように入力します。

$ getconf ARG_MAX
> 2621440

関連情報