Найти все доступные для записи файлы в текущем каталоге - PullRequest
24 голосов
/ 22 марта 2010

Я хочу быстро определить все записываемые файлы в каталоге. Какой быстрый способ сделать это?

Ответы [ 10 ]

33 голосов
/ 22 марта 2010
find -type f -maxdepth 1 -writable
16 голосов
/ 22 марта 2010

Опция -writable найдет файлы, доступные для записи текущему пользователю. Если вы хотите найти файлы, которые могут быть записаны кем-либо (или даже другими комбинациями), вы можете использовать параметр -perm:

find -maxdepth 1 -type f -perm /222

Это найдет файлы, которые могут быть записаны их владельцем (кем бы это ни было):

find -maxdepth 1 -type f -perm /200

Для управления значением аргумента mode могут использоваться различные символы:

  • / - любой бит разрешения
  • - - все биты (-222 будет означать все - пользователь, группа и другие)
  • без префикса - точная спецификация (222 будет означать отсутствие разрешений, кроме записи)
4 голосов
/ 22 марта 2010

чтобы найти доступные для записи файлы независимо от владельца, группы или других, вы можете проверить флаг w в столбце разрешений для файлов ls.

ls -l | awk '$1 ~ /^.*w.*/'

$ 1 - это первое поле (то есть разрешениеblock of ls -l), регулярное выражение просто скажет найти букву "w" в первом поле.это все.

если вы хотите найти разрешение на запись для владельца

ls -l | awk '$1 ~ /^..w/'

если вы хотите найти разрешение на запись для группы

ls -l | awk '$1 ~ /^.....w/'

, если хотите найти запись для другихразрешение

ls -l | awk '$1 ~ /w.$/'
3 голосов
/ 22 марта 2010

Если вы в оболочке, используйте

find .  -maxdepth 1 -type f -writable

см. Человек найти

Вы найдете лучшие ответы на этот тип вопросов на superuser.com или serverfault.com

Если вы пишете код, а не просто используете оболочку, вас может заинтересовать системный вызов access (2).

Этот вопрос уже задавался на serverfault

РЕДАКТИРОВАТЬ: @ ghostdog74 спросил, если вы удалили разрешения на запись для этого файла, если он все равно найдет файл. Ответ: нет, это находит только файлы, доступные для записи.

dwaters@eirene ~/temp
$ cd temp

dwaters@eirene ~/temp/temp
$ ls

dwaters@eirene ~/temp/temp
$ touch newfile

dwaters@eirene ~/temp/temp
$ ls -alph
total 0
drwxr-xr-x+ 2 dwaters Domain Users 0 Mar 22 13:27 ./
drwxrwxrwx+ 3 dwaters Domain Users 0 Mar 22 13:26 ../
-rw-r--r--  1 dwaters Domain Users 0 Mar 22 13:27 newfile

dwaters@eirene ~/temp/temp
$ find .  -maxdepth 1 -type f -writable
./newfile

dwaters@eirene ~/temp/temp
$ chmod 000 newfile

dwaters@eirene ~/temp/temp
$ ls -alph
total 0
drwxr-xr-x+ 2 dwaters Domain Users 0 Mar 22 13:27 ./
drwxrwxrwx+ 3 dwaters Domain Users 0 Mar 22 13:26 ../
----------  1 dwaters Domain Users 0 Mar 22 13:27 newfile

dwaters@eirene ~/temp/temp
$ find .  -maxdepth 1 -type f -writable

dwaters@eirene ~/temp/temp
3 голосов
/ 22 марта 2010

-f проверит файл

-w проверит, доступен ли для записи

Пример:

$ for f in *; do [ -f $f ] && [ -w $f ] && echo $f; done
1 голос
/ 23 марта 2010

Проблема с find -writable заключается в том, что он не переносимый и его нелегко эмулировать с переносными find операторами.Если ваша версия find не имеет ее, вы можете использовать touch, чтобы проверить, можно ли записать файл, используя -r, чтобы убедиться, что вы (почти) не изменили файл:

find . -type f | while read f; do touch -r "$f" "$f" && echo "File $f is writable"; done

Опция -r для touch есть в POSIX, поэтому ее можно считать переносимой.Конечно, это будет гораздо менее эффективно, чем find -writable.

Обратите внимание, что touch -r будет обновлять ctime * каждого файла (время последнего изменения его мета-данных), но все равно редко заботится о ctime.

0 голосов
/ 06 октября 2016

Я знаю, что это очень старая тема, однако ...

Мне помогла следующая команда: find . -type f -perm /+w

Вы можете использовать -maxdepth в зависимости от того, сколько уровней в каталоге вы хотитеискать.Я использую Linux 2.6.18-371.4.1.el5.

0 голосов
/ 30 декабря 2013

Если вы хотите найти все файлы, доступные для записи с помощью Apache Etal, то вы можете сделать это:

sudo su www-data
find . -writable 2>/dev/null 

Замените www-данные ни на кого, ни на apache, или на то, кем является ваш веб-пользователь.

0 голосов
/ 22 марта 2010
stat -c "%A->%n" *| sed -n '/^.*w.*/p'
0 голосов
/ 22 марта 2010
for  var in `ls`
do
if [ -f $var -a -w $var ]
then
echo "$var having write permission";
else
echo "$var not having write permission";
fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...