Список файлов только для чтения


3

Мне нужно перечислить или показать или запросить файлы в папке (ну, технически, на USB-диске, но я могу перейти к нему в Finder / Terminal), которые помечены только для чтения.

Все Google-фу в мире просто раскрывает решения по изменению разрешений, но мне это не нужно

Моя видеорегистратор помечает видео / изображения только для чтения, чтобы сохранить их, когда я нажимаю на кнопку, но они все еще находятся в папке с несколькими сотнями файлов MOV, и мне нужен простой способ отфильтровать те, которые я ищу.

Ответы:


1
find . -type f -perm +444 \! -perm +222

ищет все файлы ( -type f ) которые читаются ( -perm +444 ) но не для записи ( ! +perm +222 ).

Если ваш ум ошеломлен после прочтения -perm в man find Вы также можете использовать (значительно медленнее, особенно на медленных устройствах) вариант обработки вывода find сам:

find . -type f -print0 |
    xargs -0 -n 1 sh -c '[ -r "$1" -a ! -w "$1" ] && echo "$1"' sh

Это в основном занимает каждый файл find находит и запускает его через небольшой скрипт для проверки прав доступа.

PS: эй, я не сказал, что второй способ менее ошеломляющий :-)


1
Хотя второй метод работает медленнее, в некоторых ситуациях он может быть более точным, если, например, я не ошибаюсь в этом примере теста: touch test_file; sudo chown root:staff test_file; (первый метод не в состоянии перечислить файл, хотя это файл только для чтения для пользователя)
Yoric

1
@Yoric Для этого нет общего решения find один, посмотри unix.stackexchange.com/questions/22421/... и оригинальный вопрос, связанный оттуда. В случае с OP это, вероятно, не проблема.
nohillside

1
Спасибо, у меня сейчас кружится голова, так что многому научиться копаться в "простых вопросах" :)
Yoric

1

Одним из способов является использование -w опция в bash, чтобы проверить, доступен ли файл для записи или нет.

Перейдите в каталог, в котором вы хотите проверить свои файлы, затем введите:

for RO in $(find . -type f);do [ -r "$RO" ] && [ ! -w "$RO" ] && echo $RO;done

(кредит www.unix.com )

[РЕДАКТИРОВАТЬ]

Чтобы разобраться с пробелами в именах файлов, лучше использовать find -exec путь, а не зацикливаться на find:

find . -type f -exec [ -r {} ] \; -exec [ ! -w {} ] \; -exec echo {} \;

или же

find . -type f -exec [ -r {} ] \; -exec [ ! -w {} ] \; -print

Текстовый анализ вывода из find обычно разбивается на имена файлов, содержащие пробелы и тому подобное. Может не быть проблемой в контексте ОП, но может ударить вас в других обстоятельствах.
nohillside

@nohillside Спасибо за голову, я исправил случай, заменив цикл for с помощью find -exec
Yoric

Мое (надеюсь) последнее замечание по этому поводу: find . -type f -exec [ -r {} -a \! -w {} ] \; -printгораздо легче читать, чем find ... | xargs ... sh -c чудовище в моем собственном ответе :-)
nohillside

-1

Перечислите файлы и grep для шаблона только для чтения:

ls -l | grep '^-r--'

^ Символ обозначает начало строки.

Здесь мы фильтруем только файлы, упоминая ^-после этого ищем только файлы разрешения на чтение, указав r--, Если вы хотите фильтровать чтение & amp; исполняемые файлы разрешений, вы можете использовать r-x,

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

ls -l | grep '^-r--' | awk 'NF>1{print $NF}'

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


2
Grepping ls -l это умный способ сделать это, но учтите, что ваши файлы могут начинаться с -rw-r--r-- с root как владелец, и такие файлы не будут перечислены, даже если они не доступны для записи пользователю
Yoric

1
grep ... | awk обычно не требуется, вторая команда может быть переписана как ls -l | awk '/^-r--/ {print $NF}'
nohillside
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.