web-dev-qa-db-ja.com

曜日に基づいてファイルを検索する方法

実際、毎月金曜日に2012年に作成されたファイルとフォルダーを検索する必要があります。

findコマンドを使用していくつかの試みをしましたが、機能しませんでした。

6
OmiPenguin

findを使用する最も簡単な方法は次のとおりです。

_find / -daystart -mtime +41 -mtime -408 \
  -printf "%M %n %u %g %10s %TY-%Tm-%Td %Ta %TH:%TM:%TS %h/%f\n" |
awk '($7=="Fri"){print}'
_

必要に応じて_-printf_を調整します。ここでは、_ls -l_に近くなるようにしています。 _%T_(および_%A_ _%C_)を使用すると、タイムスタンプにstrftime()形式を使用できます。_%Ta_は曜日です。 (41〜408日の範囲を調整する必要があるかもしれませんが、これは実際には単なる最適化です。_grep 2012_を調整するか、_-printf_を調整してgrepを簡単にすることができます。)

編集:より堅牢なバージョンですが、明確さが少し失われています:

_find / -daystart -mtime +41 -mtime -408 \
   -printf "%M %n %u %g %10s %TY-%Tm-%Td %Ta %TH:%TM:%TS\0%h/%f\0\0" |
gawk 'BEGIN{RS="\0\0"; FS="[\0]"} ($1~/ Fri /) { printf $2 "\0"}' | 
xargs -0 -n 1 -i ls -l "{}"
_

これは_-print0_をエミュレートしますが、各行には2つの_\0_区切りフィールドがあり、ファイル名は2番目です。最後の_ls -l "{}"_を、ファイルに対して行う必要のあるものに置き換えます。私は明示的にgawkを使用していますが、他のawkはRS/FSの\ 0バイトにそれほど親切ではありません(ファイル名の改行も処理するように更新されています)。

また、mreithubで提案されているように、_%Tu_と同様に、または_%Ta_の代わりに番号付きの平日に使用できます。言語に依存しないオプション。

7
mr.spuratic

gnuツールを使用する場合:

find . -exec bash -c '[[ $(date -r "$0" +%u%Y) = "52012" ]]' {} \; -print

ファイル/ディレクトリ名は、前の-printが返された場合にのみ-execされますtrue、つまり、date -rによって報告されたmtimeが指定された形式(%u%Y)は52012です

または、zshのみのソリューションを好む場合(非常によく似ていますが、e-文字列は、引用符内の式が返すファイル/ディレクトリのみを選択しますtrue =):

zmodload zsh/stat
print -rl -- **/*(De_'[[ $(zstat -F "%u%Y" +mtime -- $REPLY) = "52012" ]]'_)
0
don_crissti