Как проверить наличие файлов в файловой системе или каталоге с помощью 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.
Другие вопросы по тегам