シェルスクリプトで日付を使用する

シェルスクリプトで日付を使用する

シェルスクリプトでdateコマンドを使用する際に問題があります。私のスクリプトは次のとおりです。

#!/bin/bash

for i in $(find . -type f -mtime +10 ); 
do
    echo "$i"
    echo "ligne dans la boucle";
    #il faut verifier si il a ete créer un samedi ou pas;
    jour=`ls -lrt $i| awk '{print $7}'`;
    mois=`ls -lrt $i| awk '{print $6}'`;
    annee=`ls -lrt $i| awk '{print $8}'`;
    requette="date -d '$mois $jour $annee' +'%a %u %A'";
    echo $requette;
    test=$($requette);
    echo $test;
    echo " ";
done

したがって、出力は次のようになります。

date: extra operand ‘2015'’

しかし、シェルから直接コマンドを使用すると機能します。/

requette="date -d 'Feb 28 2015' +'%a %u %A'"

誰かが私を助けることができれば良いでしょう!

ベストアンサー1

GNU ツールを使用して 10 日を超えて土曜日 (スクリプトを実行しているユーザーのタイムゾーン) で最後に変更された一般的なファイルを見つけたい場合 (そして GNU 固有のオプションdateと GNU シェル)、次のことができます。

find . -type f -mtime +10 -printf '%Tu%p\0' |
  sed -zn 's/^6//p' |
  tr '\0' '\n'

GNUは最終的に2000年代初頭にGNUstatよりスクリプト可能な方法でファイルメタデータよりもls(しかし他の)コマンドを追加しました。findstat

他のほとんどのstat実装はどんな形式でも修正時間を提供できますが、GNUはそうではありません(だからあなたは質問でGNUとの組み合わせに頼ることになったようですstat)。ただし、GNUは可能です(GNUを使用するとそれも使用できます)。lsdatefinddatedate -r "$file" +%u

上記は、%T<format-letter>指定された形式を使用した修正時間ですstrftime%Tu曜日を意味し、1(月曜日)から7までの数字です。これは、ロケールに依存する%a/を使用するよりもスクリプトで優れています。%A

その番号を印刷してから改行でファイル名を処理できるように、NULで区切られたファイルパスを印刷し、パイプを介してsed6で始まるレコードを選択します6(および6を削除します)。その後、NULは出力時に改行文字に変換されます。

-z2012年にGNUに追加されましたsed。年齢が多い場合は、sed上記の内容を次のように変更できます。

find . -type f -mtime +10 -printf '%Tu%p\0' |
  tr '\0\n' '\n\0'
  sed -n 's/^6//p' |
  tr '\0' '\n'

一般的に言えば、find質問のように出力を繰り返したくありません。find見つかったファイルを繰り返すには、bash次のことをお勧めします。

 while IFS=/ read -d '' -ru3 day file; do
   case $day in
     (6) printf '"%s" was last modified on a Saturday\n' "$file";;
   esac
 done 3< <(find . -type f -mtime +10 -printf '%Tu/%p\0')

では、zsh次のこともできます。

zmodload zsh/stat # for zsh's stat builtin
last_modified_on_a_saturday() {
  local -A stat
  stat -LF %u -H stat -- ${1-$REPLY} &&
    ((stat[mtime] == 6))
}
for file in **/*(ND.m+10+last_modified_on_a_saturday); do
   do-something with $file
done

おすすめ記事