过滤特定日期的文件

过滤特定日期的文件

我的操作系统是 Solaris 10(64 位),日志目录中有很多文件,每天我们都会收到 40-50 个日志。我在此目录中存在最近 20 天的文件,并且我想将每天的文件移动到特定目录,该目录的名称附加有文件日期。

例如

File_name  date
1.txt      31-jul-20122 
2.txt      01-Aug-2012

然后为 2012 年 7 月 31 日的旧文件创建一个目录,并移动到新目录 31-jul RIO_31-Jul-2012 并移动它们,对于 8 月 1 日的文件也是如此。

我编写了一个脚本,该脚本在当前日期运行良好,但我不知道如何修改它以适应旧日期。

我的脚本如下

NEWDIR=RIO_31-Jul-2012
mkdir /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
cd /var/opt/ers/logs/rio
touch -t `date +%Y%m%d0000` dummy
find . -newer dummy -type f  |
while read fname
do
    mv $fname /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
done

答案1

在 Solaris 下,您可以使用ls -E.

迭代日志目录中的所有文件。对于每个文件,获取日期,根据需要创建目标目录,然后移动文件。

for f in /var/opt/ers/logs/rio/*; do
  ymd=$(ls -Eog "$f" | awk '{print $4}')
  target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
  mkdir -p "$target"
  mv "$f" "$target"
done

请注意,存档目录的名称将类似于RIO_2012-07-31而不是RIO_31-Jul-2012.我推荐 YMD 格式,因为它按时间顺序排序。如果您确实需要缩写的月份名称和 DMY 顺序,请使用ls -e而不是ls -E并相应地更改 awk 调用:

  mdy=$(ls -eog "$f" | awk '{print $5 "-" $4 "-" $7}')

如果您需要递归地查找子目录中的文件,请find调用迭代所有文件,然后再次执行每个文件的 shell 代码片段。

find /var/opt/ers/logs/rio -type f -exec sh -c '
  ymd=$(ls -Eog "$0" | awk "{print \$4}")
  target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
  mkdir -p "$target"
  mv "$0" "$target"
' {} \;

使用find,您可以添加! -newer somefilebefore-exec以仅匹配早于somefile.您只能添加-mtime 42至少 42 天前修改过的匹配文件。

答案2

您可以通过 ctime o atime 查找文件,然后将列出的文件移动到正确的目录中:

find . -iname "*.txt" -ctime -<daysago> -type f

“天前”是一个整数。

相关内容