![如何使用 bash 检查文件系统或目录中丢失的文件(崩溃后)?](https://linux22.com/image/827254/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20bash%20%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%88%96%E7%9B%AE%E5%BD%95%E4%B8%AD%E4%B8%A2%E5%A4%B1%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%88%E5%B4%A9%E6%BA%83%E5%90%8E%EF%BC%89%EF%BC%9F.png)
系统卸载根分区后,我检测到文件系统中缺少一些文件。
我正在尝试使用以下方法检查是否缺少其他文件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
和都有一个参数locate
,xargs
使用空字符而不是空格或换行符来分隔文件名。这应该可以解决文件名中空格的问题。
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.