我有一个包含文件名和文件路径的文件 我想删除那些不再存在的文件的行
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"
答案 0 :(得分:1)
以这种方式:
tmp=$(mktemp)
while IFS=';' read -r file rest; do
[ -f "$file" ] && printf '%s;%s\n' "$file" "$rest"
done < file.txt > "$tmp" && mv "$tmp" file.txt
或者如果您因某些原因不想要临时文件:
tmp=()
while IFS=';' read -r file rest; do
[ -f "$file" ] && tmp+=( "$file;$rest" )
done < file.txt &&
printf '%s\n' "${tmp[@]}" > file.txt
两者都未经测试,但如果不完全正确则应非常接近。
答案 1 :(得分:0)
如果我理解,应该这样做。
touch file.txt file2.txt
for i in `cat file.txt`; do
fp=`echo $i|cut -d ';' -f2`
if [ -e $fp ];then
echo "$i" >> file2.txt
fi
done
mv file2.txt file.txt