移动文件超过一天

时间:2012-12-16 14:13:17

标签: linux shell unix scripting

我使用下面的脚本将超过一天的文件移动到其他目录,我只是用echo语句检查它是否正常工作。

    for i in `ls -lhrt | grep TRACK`
    do
     for j in `$i | awk '{print $7}'`
     do
      if [[ $j -lt $((`date |  awk '{print $3}'` - 1)) ]];
       then echo $j less than $((`date |  awk '{print $3}'` - 1))
      fi
     done
    done

但我看到一些错误,脚本运行不正常。如果我执行ls -lhrt | grep TRACK | awk '{print $7}',它可以正常工作并返回日期(数字字段)。

如果我修改脚本如:

    for i in `ls -lhrt | grep TRACK | awk '{print $7}'`
    do 
     if [[ $i -lt $((`date |  awk '{print $3}'` - 1)) ]]; 
      then echo $i less than $((`date |  awk '{print $3}'` - 1))
     fi
    done

虽然工作正常。

我在原始脚本中错过的确切逻辑是什么?

2 个答案:

答案 0 :(得分:2)

您的脚本假设第一个for循环(for i in ...)在行上迭代,但该假设是错误的。如果在循环体中添加echo "$i",您将看到它对单词而不是行进行操作。

已经指出了下一个错误,就是在行

for j in `$i | awk '{print $7}'`

脚本尝试执行变量$ i的内容。您想在此处添加echo命令,如下所示:

for j in `echo $i ...

但当然这不会解决你的问题,因为$ i已经包含单个单词,并且awk没有第7个单词可以打印。

一个简单的解决方案(如果你坚持不使用find)确实是你自己写的:

for i in `ls -lhrt | grep TRACK | awk '{print $7}'`

但是如果你想保留两个循环,可以在脚本中更改特殊变量IFS(内部字段分隔符),如下所示:

#!/bin/bash

OIFS="$IFS"
IFS="
"
for i in `ls -lhrt` ; do
  IFS="$OIFS"
  echo ">>$i<<"
  for j in `echo $i|awk '{print $7}'` ; do
    echo ">>$j<<"
  done
done

IFS="分配在单行"的下一行结束后,"的行不包含任何内容,因此将换行符分配给IFS特殊变量。请务必在脚本中尽快恢复IFS。 (如果你没有这样做,你将从shell中获得非常混乱的行为,因为空格不再单独的单词......)

PS:您知道每次新月开始时您的脚本都会失败吗?

PPS:您知道您的脚本取决于当前的区域设置吗?在我的电脑上,这一行的第7个字在一年的这个时候是“Dez”,所以在运行脚本时我必须添加LANG=C

答案 1 :(得分:0)

刚看到你的更新

$i | ...

将尝试运行一个被调用的可执行文件,无论$i的值是什么。在你的情况下,这将适用于$ i = 1,2和3(但不能做你想要的),否则就失败了。

您希望将字符串发送到管道中的下一个进程,而不是按该名称运行可执行文件。你需要做

echo $i | ...