Как проверить наличие файлов в файловой системе или каталоге с помощью bash (после сбоя)?
После того, как система размонтировала корневой раздел, я обнаружил, что в файловой системе отсутствуют некоторые файлы.
значки wifi и gwibber исчезли из апплета индикатора
Я пытаюсь проверить, отсутствуют ли другие файлы, используя программу ls и программу locate, которая работает с индексами предыдущего состояния файловой системы.
Таким образом,
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 (OMG!! Это больше не "запрещено", как в старые добрые времена).
Если, например, я использую:
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.