bash list file (ls) и найдите номер - PullRequest
1 голос
/ 18 апреля 2019

У меня в каталоге есть эти файлы

ls -l /toto/
total 0
brw-rw---- 1 tata par 112, 24 Apr 16 13:08 file1
brw-rw---- 1 tata par 112, 23 Apr 16 13:08 file2

Мой bash должен проверить, что число 112 присутствует для всех строк

for f in $(ls -l /toto/);
do
fff=`grep "112" $f`
echo $fff
done

result:
grep: tata: No such file or directory
grep: 112: No such file or directory
grep: file1: No such file or directory

почему? как ? Спасибо

1 Ответ

2 голосов
/ 18 апреля 2019

Файлы, перечисленные в вашем вопросе, являются блочными устройствами (об этом говорит b в качестве первого символа в блоке разрешений).

Это означает, что 112 и 24 являются основной и вспомогательной версией первого файла в десятичной записи.

Команда Unix stat может использоваться для создания списка файлов, использующего пользовательский формат (в отличие от ls, который знает только несколько фиксированных форматов).

Командная строка, которая вам нужна:

stat --format "%t %n" /toto/*

В спецификаторе формата %t указывается основная версия файла устройства в шестнадцатеричном формате. %n перечисляет имя файла (мы используем его для отладки).

112 в шестнадцатеричном формате 0x70. Команда выше должна вывести:

70 file1
70 file2

Теперь вы можете передать его по grep '^70 ', а затем по wc -l, чтобы подсчитать количество строк, начинающихся с 70 (70, за которым следует пробел):

stat --format "%t %n" /toto/* | grep '^70 ' | wc -l

Если вы хотите узнать, имеют ли все файлы в каталоге /toto/ основную версию 112, вы можете сравнить число, произведенное вышеупомянутой командой, с числом, произведенным следующей командой (она производит количество файлов и каталоги в каталоге /toto/) `

ls -1 /toto/ | wc -l

Если вы также хотите узнать, какие файлы имеют другую основную версию, вы можете запустить эту команду:

stat --format "%t %n" /toto/* | grep -v '^70 '

Отфильтровывает строки, которые не начинаются с ^70, и отображает только файлы с другой основной версией (и их основной версией в шестнадцатеричном формате).

Если он ничего не отображает, тогда все файлы в каталоге /toto/ имеют основную версию 112.

Примечание: команда выше также выведет список обычных файлов и каталогов, а также других файлов, которые не являются устройствами (только версии имеют устройства).

...