Найти файлы с правами на запись для текущего пользователя - PullRequest
4 голосов
/ 11 марта 2019

Мне нужно найти файлы в каталоге, который имеет права на «запись» для текущего пользователя.

Я пытался использовать find, как показано ниже:

find $DIR -type f -user $(whoami) -perm -u+w

Но выше find ищет файл, принадлежащий $(whoami).

Файлы, которые я ищу, могут не принадлежать $(whoami), но все еще имеют разрешения (например, разрешение 666)

Я также попробовал ниже (извините, если это выглядит глупо):

find $DIR -type f -exec test -w {} \;

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Ваша вторая команда верна, вам просто нужно распечатать пути. Обычно -print не нужно упоминать, но с несколькими опциями, такими как -exec, вы должны явно указать, что вы хотите напечатать найденные пути.

find "$DIR" -type f -exec test -w {} \; -print

Вы можете задаться вопросом: » Почему эта печать только для записи файлов? «

find использует оценку короткого замыкания - следующая опция оценивается только в случае успешной работы предыдущей опции.
Пример: В команде find -type f -user USER проверка -user USER будет выполняться только для файлов, но не для каталогов, так как -type f не выполняется для каталогов.

Опция -exec cmd также действует как проверка - состояние выхода cmd будет использоваться для определения того, прошла проверка или нет.
Пример: find -exec false \; -user USER никогда не выполнит проверку -user USER, поскольку программа false никогда не будет выполнена успешно.

В вашем случае это означает, что -print будет выполняться только в случае успеха test -w.

1 голос
/ 11 марта 2019

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

Вы можете сделать скрипт

#!/bin/sh
test -w "$1" && echo "$1"

и затем используйте -exec в этом сценарии.

ОБНОВЛЕНИЕ: Если вам не нравится идея иметь отдельный скрипт, вы можете поместить его также в одну строку:

find $DIR -type f -exec bash -c 'test -w "$1" && echo "$1"' x {} \;

Одинокий x просто служит заполнителем, потому что это то, что bash видит как $ 0, и вы хотите присвоить текущему файлу $ 1. Другая возможность будет

find $DIR -type f -exec bash -c 'test -w "$0" && echo "$0"' {} \;

но для меня это выглядит менее ясно и похоже на неправильное использование $ 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...