2012-12-16 25 views
0
1天

我使用下面的脚本来移动超过一天到其他目录旧文件,我只是用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 

它工作正常不过。

什么是我在原来的剧本错过了准确的逻辑是什么?

+0

我敢肯定,你可以用''mtime + 1'或'-ctime + 1'选项来查找。 –

+0

@paul:是的。但我只是想知道这个特定脚本可能会出现什么问题。 Mant谢谢 –

+0

我不确定你想要完成什么,但是你的''j'行试图执行$ i中的任何内容,并将其输出传递给awk。我怀疑你的意思是要回传$ i并将其传递给awk。 –

回答

0

刚刚看到您的更新

$i | ... 

将尝试运行那个叫什么的$i值是一个可执行文件。在你的情况下,这将工作$ i = 1,2和3(但不是做你想做的),否则失败。

你想串发送到下一个进程在管,而不是该名称运行一个可执行文件。你需要做的

echo $i | ... 
+0

不,没有帮助。这不会产生任何输出 –

+0

'echo $ i'只会在找到空间的任何地方破坏线路。 –

2

你的脚本适用于假设第一个for循环(for i in ...)上线迭代,但假设是错误的。如果您在循环体中添加echo "$i",你会看到它的话,不是行操作。

下一个错误已经指出的,并且是在该行

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

脚本尝试$执行变量的内容我。你想在这里添加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。 (如果你不这样做,你会从外壳得到非常混乱的行为,因为空间不再分开的话...)

PS:你知道你的脚本将每次失败了新的一个月开始时?

PPS:您知道您的脚本取决于当前的语言环境吗?在我的电脑上,这一行中第7个字是“Dez”,所以我在运行脚本时必须添加LANG=C