Bash,从文件中删除特定行

时间:2018-03-22 06:56:58

标签: bash file awk

我有一个包含文件名和文件路径的文件 我想删除那些不再存在的文件的行

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"

2 个答案:

答案 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