Не может создать a+r файл

В системах (и файловые системы) поддержка SEEK_HOLE lseek флаг (как Ваша Ubuntu 12.04 на ext4 был бы), и принятие значения для SEEK_HOLE 4, как это находится на Linux:

if perl -le 'seek STDIN,0,4;$p=tell STDIN;
   seek STDIN,0,2; exit 1 if $p == tell STDIN'< the-file; then
  echo the-file is sparse
else
  echo the-file is not sparse
fi

Тем синтаксисом оболочки является POSIX. Непортативный материал в нем perl и это SEEK_HOLE.

lseek(SEEK_HOLE) ищет на запуск первой дыры в файле или конец файла, если никакая дыра не найдена. Выше мы знаем, что файл не редок когда lseek(SEEK_HOLE) берет нас в конец файла (к тому же месту как lseek(SEEK_END)).

Если Вы хотите перечислить редкие файлы:

find . -type f ! -size 0 -exec perl -le 'for(@ARGV){open(A,"<",$_)or
  next;seek A,0,4;$p=tell A;seek A,0,2;print if$p!=tell A;close A}' {} +

GNU find (начиная с версии 4.3.3), имеет -printf %S сообщить о разреженности файла. Это проявляет тот же подход как frostschutz' ответ, в котором это берет отношение использования диска по сравнению с размером файла, так, как гарантируют, не сообщит обо всех редких файлах (как то, когда существует сжатие на уровне файловой системы или где свободное место, оставленное дырами, не компенсирует инфраструктуру файловой системы служебные или большие расширенные атрибуты), но работал бы над системами, которые не имеют SEEK_HOLE или файловые системы, где SEEK_HOLE не реализован. Здесь с инструментами GNU:

find . -type f ! -size 0 -printf '%S:%p\0' |
  awk -v RS='\0' -F : '$1 < 1 {sub(/^[^:]*:/, ""); print}'

(обратите внимание, что более ранняя версия этого ответа не работала правильно когда find выраженный разреженность что касается экземпляра 3.2e-05. Благодаря ответу @flashydave для того, чтобы обратить мое внимание на него)

4
26.06.2014, 02:53
1 ответ

Потому что ваша система использует ACL, так что файл будет иметь расширенное разрешение. Попробуйте:

getfacl test

увидеть точное разрешение файла.

.
3
27.01.2020, 20:58

Теги

Похожие вопросы