![ディレクトリ内の最後の4つのファイルのサイズが互いに等しい場合は終了し、それ以外の場合は[閉じる]](https://linux33.com/image/90966/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%86%85%E3%81%AE%E6%9C%80%E5%BE%8C%E3%81%AE4%E3%81%A4%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%8C%E4%BA%92%E3%81%84%E3%81%AB%E7%AD%89%E3%81%97%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E7%B5%82%E4%BA%86%E3%81%97%E3%80%81%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AF%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
次の作業に役立つシェルbashスクリプトを教えてください。
最後に追加されたディレクトリの4つのファイルのサイズが同じ場合は終了し、それ以外の場合は続行します。
例:
ls -l $dir_path | awk '{print $5}' | tail -4
印刷された4つの値が互いに等しい場合は終了し、それ以外の場合は続行します。
答え1
zsh -c 'zmodload zsh/stat
[[ $(zstat -N +size -- *(.om[1,4])) =~ $'\''(.*)\n\\1\n\\1\n\\1'\'' ]]' && exit
現在のディレクトリに隠されていない最新の一般ファイルの4つが同じサイズの場合は終了します。
GNUシステムでは、次のこともできます。
find . -maxdepth 1 ! -name '.*' -type f -printf '%T@ %s\n' |
sort -rn |
awk 'NR == 1 {v = $0}; v != $0 {exit}; NR == 4 {exit 1}' || exit
POSIX的に:
ls -tnq -- "$dir_path" |
awk '!/^-/ {next}
n++ == 0 {v = $5}
v != $5 {exit}
n == 4 {exit 1}' || exit
自分のアプローチのように、最新の4つ(アルファベット順のリスト)の代わりに最後の4つ(通常のファイル、シンボリックリンク、ソケットなど)を出力するには、次のようにしますls
(まだPOSIXly)。
ls -rnq -- "$dir_path" |
awk 'NR == 1 {next}
NR == 2 {v = $5}
v != $5 {exit}
NR > 4 {exit 1}' || exit
答え2
ls -c
ソートに使用時間、uniq
同じであることを確認してください。
ls -crntq | tail -4 | awk '{print $5}' | uniq -c | grep -q "^\s*4\s" && exit