如何使用 bash 检查文件系统或目录中丢失的文件(崩溃后)?

如何使用 bash 检查文件系统或目录中丢失的文件(崩溃后)?

系统卸载根分区后,我检测到文件系统中缺少一些文件。

wifi 和 gwibber 图标从指示器小程序中消失

我正在尝试使用以下方法检查是否缺少其他文件ls计划和定位程序,它使用文件系统先前状态的索引来工作。

因此,

locate /usr/share/icons/* | xargs ls -d 2>&1 >/dev/null

之所以能达到这个目的,是因为ls为每个不存在的文件显示一条错误消息定位定位;我可以像这样计算丢失的文件数:

locate /usr/share/icons/* | xargs ls -d 2>&1 >/dev/null | wc -l

除了文件名中包含空格的情况外;并且,毫不奇怪,这就是 Ubuntu 的情况(天哪!!它不再像过去那样被“禁止”了)。

例如,如果我使用:

locate /usr/share/* | xargs -Iñ ls -d 'ñ' 2>&1 >/dev/null

它不起作用,因为标准输出的重定向和参数的使用之间存在某种语法干扰-I

有人可以帮助我理解这个语法或者提供其他想法吗?

编辑。-

我已经消除了空格的问题,但是不是很优雅,就像这样:

locate /usr/share/* | sed -e 's/^/"/' -e 's/$/"/' | xargs ls -d 2>&1 >/dev/null|

但我确信肯定还有许多更好的解决方案,我渴望看到。

答案1

和都有一个参数locatexargs使用空字符而不是空格或换行符来分隔文件名。这应该可以解决文件名中空格的问题。

locate -0 /usr/share/icons/* | xargs -0 ls -d 2>&1 >/dev/null

man locate

   -0, --null
          Separate  the  entries  on  output using the ASCII NUL character
          instead of writing each entry on a separate line.   This  option
          is  designed  for interoperability with the --null option of GNU
          xargs(1).

man xargs

   --null
   -0     Input  items  are  terminated  by a null character instead of by
          whitespace, and the quotes and backslash are not special  (every
          character is taken literally).  Disables the end of file string,
          which is treated like any other  argument.   Useful  when  input
          items  might  contain  white space, quote marks, or backslashes.
          The GNU find -print0 option produces  input  suitable  for  this
          mode.

相关内容