Я хочу быстро определить все записываемые файлы в каталоге. Каков быстрый способ сделать это?
Найти все записываемые файлы в текущем каталоге
Ответ 1
find -type f -maxdepth 1 -writable
Ответ 2
Опция -writable
найдет файлы, которые могут быть записаны текущим пользователем. Если вы хотите найти файлы, доступные для записи кем угодно (или даже другие комбинации), вы можете использовать опцию -perm
:
find -maxdepth 1 -type f -perm /222
Здесь будут найдены файлы, которые могут быть записаны владельцем (кем бы это ни было):
find -maxdepth 1 -type f -perm /200
Для управления значением аргумента mode могут использоваться различные символы:
-
/
- любой бит разрешения -
-
- все биты (-222
означают все - пользователь, группа и другие) - no prefix - точная спецификация (
222
означает отсутствие перехватов, кроме записи)
Ответ 3
Если вы используете оболочку
find . -maxdepth 1 -type f -writable
см. поиск человека
Вы найдете ответы на этот вопрос лучше на superuser.com или serverfault.com
Если вы пишете код не только с помощью оболочки, вы можете быть заинтересованы в системном вызове доступа (2).
Этот question уже задан на serverfault
EDIT: @ghostdog74 спросил, удалили ли вы права на запись для этого файла, если это все равно найдет файл. Ответ: нет, это только файлы, доступные для записи.
[email protected] ~/temp
$ cd temp
[email protected] ~/temp/temp
$ ls
[email protected] ~/temp/temp
$ touch newfile
[email protected] ~/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
[email protected] ~/temp/temp
$ find . -maxdepth 1 -type f -writable
./newfile
[email protected] ~/temp/temp
$ chmod 000 newfile
[email protected] ~/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
[email protected] ~/temp/temp
$ find . -maxdepth 1 -type f -writable
[email protected] ~/temp/temp
Ответ 4
-f
проверит файл
-w
проверит, может ли он записываться
Пример:
$ for f in *; do [ -f $f ] && [ -w $f ] && echo $f; done
Ответ 5
чтобы найти файлы, доступные для записи, независимо от владельца, группы или других лиц, вы можете проверить флаг w
в столбце разрешения файла ls.
ls -l | awk '$1 ~ /^.*w.*/'
$1 - это первое поле (т.е. блок разрешений ls -l), регулярное выражение просто скажет, что в первом поле находится буква "w". что все.
если вы хотите найти разрешение на запись владельца
ls -l | awk '$1 ~ /^..w/'
если вы хотите найти разрешение на запись группы
ls -l | awk '$1 ~ /^.....w/'
если вы хотите найти другое разрешение на запись
ls -l | awk '$1 ~ /w.$/'
Ответ 6
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
Ответ 7
stat -c "%A->%n" *| sed -n '/^.*w.*/p'
Ответ 8
Проблема с 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.
Ответ 9
Если вы хотите найти все файлы, доступные для записи apache etal, вы можете сделать это:
sudo su www-data
find . -writable 2>/dev/null
Замените www-данные никем или апачем или каким бы то ни было вашим веб-пользователем.
Ответ 10
Я знаю, что это очень старый поток, однако...
Эта команда помогла мне: find . -type f -perm /+w
Вы можете использовать -maxdepth, исходя из того, сколько уровней под каталогом вы хотите искать. Я использую Linux 2.6.18-371.4.1.el5.