如何列出缺少对应真实文件的备份文件?

AJM*_*eld 2 grep bash backup file-search

我不小心删除了主目录中的一些文件,但我不知道到底删除了哪些文件。如何获取所有缺少相应文件的备份文件的列表?(相当于,名称以波浪号结尾的文件,而同一目录中没有另一个具有相同名称且没有尾随波浪号的文件?)

到目前为止我尝试了一些事情;虽然我不记得确切的标志,但它是这样的:

grep -Rlv '(.*)\n\\1~|.*(?!~)'
Run Code Online (Sandbox Code Playgroud)

那没有用,也没有:

ls -R | grep -v '(.*)\n\\1~|.*(?!~)'
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到这些文件?

ter*_*don 5

只需找到所有带有波浪号的文件,删除波浪号并查找“原始”:

find . -name '*~' -print0 | while IFS= read -r -d '' file; do 
  [ -e "${file%\~}" ] ||  echo cp "$file" "${file%\~}"; done 
done 
Run Code Online (Sandbox Code Playgroud)

解释:

  • find ~/ -name '*~' -print0$HOME:以波浪号查找该末尾的所有文件,并使用 null ( \0) 字符打印它们。最后一个对于处理包含换行符等的奇怪文件名是必要的。

  • while IFS= read -r -d '' file;:将找到的每个文件读find入 $file`。

  • IFS=: bash 在空白处自动分割的轮次
  • -r:按字面意思对待反斜杠(不作为转义字符)
  • -d '':将输入字段分隔符设置为空字符。
  • "${file%\~}": 删除波形符,请参阅此处
  • [ -e "${file%\~}" ] || echo cp "$file" "${file%\~}":仅当文件名(无波浪号)不存在时才会运行 echo。要实际复制文件,只需删除echo.