我在 shell 脚本中使用 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'’
但是当我直接在 shell 上使用该命令时它可以工作:/
requette="date -d 'Feb 28 2015' +'%a %u %A'"
如果有人能帮助我那就太好了!
答案1
如果您想使用 GNU 工具查找 10 天以上且上次修改时间为星期六(运行脚本的用户的时区)的常规文件(并且您似乎使用的是 GNU 系统)正在使用 GNU 特定选项date
和 GNU shell),您可以执行以下操作:
find . -type f -mtime +10 -printf '%Tu%p\0' |
sed -zn 's/^6//p' |
tr '\0' '\n'
虽然 GNU 最终在 2000 年代初期添加了(但又是一个不同的)stat
命令,以比 更易于编写脚本的方式查询文件元数据ls
,但其大部分功能find
早在这之前就已经在 GNU 中,并且具有比 GNU 更好的界面stat
。
大多数其他stat
实现可以为您提供任何格式的修改时间,GNU不能(我想这就是您最终在问题中诉诸和 GNUstat
组合的原因),但 GNU可以(使用 GNU ,您也可以使用)。ls
date
find
date
date -r "$file" +%u
以上%T<format-letter>
是使用指定格式的修改时间strftime
。%Tu
是星期几,从 1(星期一)到 7 之间的数字。这在脚本中比使用依赖于语言环境的%a
/更好。%A
我们打印该数字,后跟文件路径,NUL 分隔以便能够处理带有换行符的文件名,并通过管道选择sed
以 开头的记录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
in找到的文件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