gpt4 book ai didi

linux - 移动超过一天的文件

转载 作者:太空宇宙 更新时间:2023-11-04 09:48:15 24 4
gpt4 key购买 nike

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

虽然它工作正常。

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

最佳答案

您的脚本假设第一个 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:您知道您的脚本取决于当前的语言环境吗?在我的 PC 上,每年的这个时候行的第 7 个字是“Dez”,所以我必须在运行脚本时添加 LANG=C

关于linux - 移动超过一天的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13902104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com