find … -exec ls -ls ;
の出力をファイル名でアルファベット順に並べ替えることはできますか?
これは私のcronコマンドです:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
このコマンドは、大部分は問題なく動作します。ただし、結果は意味のある順序で並べ替えられていません。ファイル名フィールドで並べ替えると非常に便利です。
ファイル名に改行が含まれていないと思います。
find /home/setefgge/public_html -type f -ctime -1 -exec ls -nls {} + | sort -k 10
+
の代わりに;
を使用して-exec
アクションを終了すると、ls
の呼び出しがバッチ処理されるため、処理が速くなります。 sort
コマンドを使用してパイプでソートできます。 10番目のフィールドからソートを開始するように指示します(最初の9つはメタデータです:ブロック、権限、リンク数、ユーザー、グループ、サイズ、および3つの日付/時刻フィールド)。オプション-n
は、ユーザーやグループに数値を使用するようにls
に指示します。これにより、空白を含むユーザーまたはグループの名前のリスクを回避できます。
または、zshを使用して、ファイル名を想定せずに glob qualifiers を使用してファイルを収集およびソートし、 zargs
を使用して、コマンドラインでls
を複数回実行できます。長すぎるでしょう。 ls
による再ソートを回避するには、GNU ls
(具体的には-f
オプション)が必要です(別のアプローチは、zshの ls
でzstat
をエミュレートすることです) 。
autoload -U zargs
zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf
POSIXは、ls
-l
ongリストの日付についてこれを言っています。
<date and time>
フィールドには、ファイルが最後に変更されたときの適切な日付とタイムスタンプが含まれます。 POSIXロケールでは、フィールドは次の日付コマンドの出力に相当します。
date "+%b %e %H:%M"
...ファイルが過去6か月間に変更されている場合、または:
date "+%b %e %Y"
これを考慮し、ファイル名に改行がある場合、POSIXで指定されたls -q
オプションを使用して改行が適切にグロブされることを確認すると、ls
なしでfind
結果なしの正規表現を準備することは比較的簡単です。
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
オプションは次のもので構成されます。
-a
は、.dot
で始まるファイルを含む、ディレクトリ内のすべてのファイルを返します。-l
長いリスト-R
はすべての子ディレクトリを再帰的にリストします-c
アクセス時間ではなく変更時間を表示する-q
は、ファイル名に表示できない文字や?
ab文字ではなく、シェルグロブ\t
を返しますこれらの結果は|pipe
ファイルを介してsed
に渡されます。
d
も含む-
で始まる行(つまり、ディレクトリのdate
ではない)の行。出力は次のようになります。
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
の優先度が低い可能性がありますが、オプションは開いています。
いずれにせよ、これは他のいくつかの可能な解決策に比べていくつかの重要な利点を提供します。
そもそもfind
+ ls
は複数の呼び出しを含みます-これは単一のls
プロセスのみを含み、これがすべてを確実にソートできる理由です-デフォルトで行うように-そしてsort
も付随的に作られます。
find
とsort
とls
を含むすべての解決策は、作業のほぼallを2回実行しています。 ls
とfind
は両方とも、すべてのパス名とstat
をすべてのファイルで解決します。 ls
とsort
は両方ともすべての結果をソートします。代わりに、単一のls
を使用するのがおそらく最善です。
そしてもちろん、この回答のdate
とsed
の部分があります。これについて注意する必要があるのは、難しい部分を実行し、最初に正規表現を取得する-1回だけです-その後、結果の取得、結果の取得、並べ替えの結果、および結果の並べ替えではなく、結果の単一のリストを整理するだけです。
他の解決策がそうする可能性があるように、これは改行を含むファイル名を壊しません。このソリューションには独自の注意点があります(次に説明します)が、それらは細かく、簡単に処理できます。私の意見では、これはここで最も堅牢なソリューションです。
上記のコマンドで問題が発生する可能性のあるケースは2つあります。最初のものはファイル名に?
グロブを含みます-それはすでにここで提供される他のどのソリューションよりもより堅牢なソリューションであり、?
が発生する可能性はそれ自体で十分に小さいため、解決する可能性がありますこれらのグロブは、複数のファイル名に一致する可能性があります。この問題の詳細については、 this を参照してください。
他の可能性には、誤検出が含まれます。たとえば、date
で検索しているgrep
文字列と実際に一致するファイル名があるが、実際にはそれらのどちらの日にも変更されていなかった場合です。私はそれが問題であることを期待していませんが、問題がある場合はそれについて尋ねてください。おそらくこれを処理するために正規表現をより具体的にするのに役立つでしょう。
Findの結果を並べ替えてパイプし、各行に対してlsを実行しませんか?
find . -type f -ctime -1 | sort | while IFS= read -r filename; do ls -ls "$filename"; done
実際には、find、xargs、lsを組み合わせて使用できます。
次にコマンドの例を示します。find . -type f -print0 | xargs -0 ls -lt
find
は、現在のディレクトリにあるすべてのファイルを再帰的に検索します。ls
コマンドに渡します(find
がARG_MAX
ファイルより少ない場合)。ls -lt
は、これらのファイルを時間順にソートし、出力をフォーマットしますシステムARG_MAX
を取得するには、次のように入力します。
$ getconf ARG_MAX
> 2621440