在 shell 脚本中使用日期

在 shell 脚本中使用日期

我在 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 ,您也可以使用)。lsdatefinddatedate -r "$file" +%u

以上%T<format-letter>是使用指定格式的修改时间strftime%Tu是星期几,从 1(星期一)到 7 之间的数字。这在脚本中比使用依赖于语言环境的%a/更好。%A

我们打印该数字,后跟文件路径,NUL 分隔以便能够处理带有换行符的文件名,并通过管道选择sed以 开头的记录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您不想像问题中那样循环输出。如果您想循环findin找到的文件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

相关内容