Я хочу быстро определить все перезаписываемые файлы в каталоге. Что быстрый путь состоит в том, чтобы сделать это?
Если вы используете оболочку,
find . -maxdepth 1 -type f -writable
см. Man find
Вы найдете лучшие ответы на этот тип вопросов на 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
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
-f
проверяет наличие файла
-w
проверяет, доступен ли он для записи
Пример:
$ for f in *; do [ -f $f ] && [ -w $f ] && echo $f; done
чтобы найти файлы, доступные для записи, независимо от владельца, группы или других, вы можете проверить флаг 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.$/'
Проблема с 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 редко кого волнует.
Параметр -writable
найдет файлы, которые доступны для записи текущему пользователю. Если вы хотите найти файлы, которые доступны для записи кем-либо (или даже в других комбинациях), вы можете использовать параметр -perm
:
find -maxdepth 1 -type f -perm /222
Это позволит найти файлы, которые доступны для записи их владельцем (кем бы может быть):
find -maxdepth 1 -type f -perm /200
Для управления значением аргумента режима можно использовать различные символы:
/
- любой бит разрешения -
- все биты ( -222
] будет означать все - пользователь, группа и другие) 222
будет означать отсутствие разрешений, кроме записи)