シェルスクリプトで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
(しかし他の)コマンドを追加しました。find
stat
他のほとんどのstat
実装はどんな形式でも修正時間を提供できますが、GNUはそうではありません(だからあなたは質問でGNUとの組み合わせに頼ることになったようですstat
)。ただし、GNUは可能です(GNUを使用するとそれも使用できます)。ls
date
find
date
date -r "$file" +%u
上記は、%T<format-letter>
指定された形式を使用した修正時間ですstrftime
。%Tu
曜日を意味し、1(月曜日)から7までの数字です。これは、ロケールに依存する%a
/を使用するよりもスクリプトで優れています。%A
その番号を印刷してから改行でファイル名を処理できるように、NULで区切られたファイルパスを印刷し、パイプを介してsed
6で始まるレコードを選択します6
(および6を削除します)。その後、NULは出力時に改行文字に変換されます。
-z
2012年に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
答え2
stat
コマンド置換を使用すると、問題が大幅に簡素化される可能性がありますls
。
#!/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'";
#//////////////////////////////
# get the month, year, and day from stat-ing the file
mois_jour_annee=`stat -c '%y' "$i" | cut -d' ' -f1`
# and then...
requette="date -d '${mois_jour_annee}' +'%a %u %A'";
echo "$requette";
test=$(eval "$requette");
echo "$test";
echo " ";
done