Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 比较文件';使用shell脚本从文件和当前目录中删除_Bash_Unix - Fatal编程技术网

Bash 比较文件';使用shell脚本从文件和当前目录中删除

Bash 比较文件';使用shell脚本从文件和当前目录中删除,bash,unix,Bash,Unix,我有一个文件files.txt,内容如下: F1.txt F2.txt F3.txt F4.txt 我需要逐行读取files.txt文件,并检查它是否存在于当前目录中,如果存在,我需要在files.txt的每一行末尾追加日期,以便输出 F1.txt16032017 F2.txt16032017 F3.txt16032017 F4.txt16032017 我使用了以下简单的shell脚本 #!/bin/bash DT=`date +%d%m%Y` while IFS=read -r line

我有一个文件files.txt,内容如下:

F1.txt
F2.txt
F3.txt
F4.txt
我需要逐行读取files.txt文件,并检查它是否存在于当前目录中,如果存在,我需要在files.txt的每一行末尾追加日期,以便输出

F1.txt16032017
F2.txt16032017
F3.txt16032017
F4.txt16032017
我使用了以下简单的shell脚本

#!/bin/bash
DT=`date +%d%m%Y`
while IFS=read -r line
do 
if [ -f $line]
then
echo "$line$DT" > files.ok
else
echo "$line" > files.notok
fi
done < files.txt
#/bin/bash
DT=`date+%d%m%Y`
而IFS=读取-r行
做
如果[-f$行]
然后
echo“$line$DT”>files.ok
其他的
echo“$line”>files.notok
fi
done

它执行时没有任何错误,但不提供带有日期附加的预期输出。有人能告诉我文件存在性测试是否正确吗

问题在于您的文件写入操作符
在每次成功的情况下都会创建一个新文件,您需要使用附加到现有文件的
>
操作符

一种更简洁的代码处理方法是

#!/bin/bash

dateToday="$(date +%d%m%Y)"

while IFS= read -r file; do
    [ -f "$file" ] && printf "%s\n"  "$file$dateToday" >> files.OK || printf "%s\n"  "$file" >> files.NOK
done < files.txt
#/bin/bash
dateToday=“$(日期+%d%m%Y)”
而IFS=read-r文件;做
[-f“$file”]&&printf“%s\n”$file$dateToday”>>files.OK | | printf“%s\n”$file”>>files.NOK
done
我为改进脚本做了哪些更新

  • 使用backticks``删除了过时的命令替换语法,并使用
    $(..)
    运行它们
  • 双引号的变量,小写的局部变量
  • 修复了文件写入操作符从
    >
  • 利用
    测试([])
    运算符的返回代码使用单行条件。如果条件
    [-f“$file”]
    成功,则运行
    &&
    之后的命令;如果条件失败,则运行
    |
    之后的命令

  • 非常感谢你。它确实对我有用。我没有在这里补充另一点。在当前目录中检查文件是否存在时,我试图附加文件的日期/时间戳。我在while循环中使用了以下代码:DT=“$(ls-lrt$file | awk-F”“{print$6$7$8}”)。现在它不会在“files.ok”文件中追加日期。有什么建议吗?好的,我现在知道了。我不得不删除=。现在它成功了。非常感谢你的帮助。