【发布时间】:2018-08-31 12:28:20
【问题描述】:
我有一个文件名和文件路径 我想删除那些不再存在的文件的行
file.txt(目前所有现有文件):
file1;~/Documents/test/123
file2;~/Documents/test/456
file3;~/Test
file4;~/Files/678
现在,如果我删除任何给定文件(例如文件 2 和文件 4)并运行我的脚本,我希望它测试给定行中的文件是否存在,如果不存在则删除该行
file.txt(删除file2、file4后):
file1;~/Documents/test/123
file3;~/Test
到目前为止我得到了什么(根本没有工作): - 根本不想跑
#!/bin/sh
backup=`cat file.txt`
rm -f file.txt
touch file.txt
while read -r line
do
dir=`echo "$line" | awk -F';' '{print $2}'`
file=`echo "$line" | awk -F';' '{print $1}'`
if [ -f "$dir"/"$file" ];then
echo "$line" >> file.txt
fi
done << "$backup"
【问题讨论】:
-
我不是 100% 明白,但您可能想首先将
done << "$backup"更改为done < "$backup" -
错误...对不起,读错了。由于
$backup不是文件名,因此您不能这样重定向。我建议要么将$backup转换为文件名,要么执行done < <(echo "$backup")。<<运算符用于 HERE 文档,而不是重定向。 -
请注意,我认为波浪号 '~' 不会在 shell 脚本中扩展,我认为它被视为字符串文字
-
读取输入文件,一次一行。如果当前行指示的文件存在,则将其添加到 bash 数组中。在循环结束时,用数组内容覆盖输入文件。