2010-03-22 4 views

Répondre

31
find -type f -maxdepth 1 -writable 
+0

Il émet un avertissement sur l'ordre des options sur mon système. –

+0

quel Linux utilisez-vous? – matja

+1

+1 pour maxdepth et type f, je les ai inclus dans ma réponse. –

3

-f testera un fichier

-w testera que ce soit inscriptible

Exemple:

$ for f in *; do [ -f $f ] && [ -w $f ] && echo $f; done 
+2

-1 inutile sans un exemple ... – lexu

+1

Inutile également de dire à quelle commande ces options sont censées s'appliquer. – bignose

+0

@ lexu/bignose - c'est une question 'bash'. '-f' et' -w' sont des opérateurs bash. De quoi d'autre avez-vous besoin ? –

4

Si vous êtes shell, utilisez

find . -maxdepth 1 -type f -writable 

voir trouver l'homme

Vous vous trouverez de meilleures réponses pour ce type de question sur superuser.com ou serverfault.com

Si vous écrivez du code non seulement en utilisant shell que vous pouvez être intéressé par l'appel système d'accès (2).

Ce question a déjà été demandé sur serverfault

EDIT: @ ghostdog74 demandé si vous avez supprimé les permissions d'écriture pour ce fichier si cela trouverait encore le fichier. La réponse, non cela ne trouve que les fichiers qui sont inscriptibles.

[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 
+1

Je vois l'erreur suivante avec votre solution: find: prédicat invalide «-writable» – vehomzzz

+0

Désolé avait. au mauvais endroit, fixe maintenant, regardez homme trouver pour voir comment utiliser cette commande –

+0

si vous supprimez toutes les autorisations inscriptibles dans un fichier, puis utilisez la commande, trouve-t-il toujours le fichier? Je suis curieux – ghostdog74

0
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 
+1

n'utilisez pas ls avec la boucle pour analyser les noms de fichiers. citez également vos variables dans le test if/else. – ghostdog74

3

pour trouver des fichiers inscriptibles quel que soit le propriétaire, groupe ou autres, vous pouvez vérifier le drapeau w dans la colonne d'autorisation de fichier de ls.

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

1 $ est le premier champ, (par exemple le bloc d'autorisation de ls -l), l'expression régulière dire juste trouver la lettre « w » dans le champ un. c'est tout.

si vous voulez trouver le propriétaire le droit d'écriture

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

si vous voulez trouver l'autorisation d'écriture de groupe

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

si vous voulez trouver d'autres écrivent l'autorisation

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

c'est génial! peut ypu expliquer cette commande awk pelase – vehomzzz

+0

que signifie tilde? – vehomzzz

+0

le tilde est l'opérateur regex d'awk pour "match". un peu comme l'opérateur regex '= ~' de Perl – ghostdog74

16

Le -writable l'option recherchera les fichiers accessibles en écriture par l'utilisateur actuel.Si vous souhaitez trouver des fichiers qui sont modifiables par tout le monde (ou même d'autres combinaisons), vous pouvez utiliser l'option -perm:

find -maxdepth 1 -type f -perm /222 

Cette recherche les fichiers qui sont inscriptibles par leur propriétaire (quel qu'il soit) :

find -maxdepth 1 -type f -perm /200 

Divers caractères peuvent être utilisés pour contrôler le sens de l'argument de mode:

  • / - un bit d'autorisation
  • - - tous les bits (-222 signifierait tout - utilisateur, groupe et autres)
  • sans préfixe - spécification exacte (222 signifierait pas permssions autres que d'écrire)
+0

C'est une solution très élégante. Comment puis-je modifier cela pour trouver des fichiers qui ne sont accessibles en écriture que par le propriétaire. – kshenoy

+3

@kshenoy: Une façon: '-perm -u + w! -perm -g + w! -perm -o + w' –

+0

Sur Mac ou n'importe quelle variante Linux antérieure, utilisez: find -type f + perm 222 – user1959190

0
stat -c "%A->%n" *| sed -n '/^.*w.*/p' 
0

Le problème avec find -writable est- que ce n'est pas portable et qu'il n'est pas facile d'émuler correctement avec les opérateurs portables find. Si votre version de find ne l'a pas, vous pouvez utiliser touch pour vérifier si le fichier peut être écrit à l'aide -r pour vous assurer que vous (presque) ne modifiez pas le fichier:

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

Le -r L'option pour touch est dans POSIX, donc il peut être considéré comme portable. Bien sûr, ce sera beaucoup moins efficace que find -writable.

Notez que touch -rsera mise à jourde chaque fichier ctime (heure de la dernière modification de sa méta-données), mais on se soucie rarement de ctime de toute façon.

+0

Avez-vous essayé 'touch' sur un fichier en lecture seule en tant que root ou sur un fichier que vous possédez? La possibilité de mettre à jour un horodatage n'implique pas que le fichier est accessible en écriture. –

+0

Si vous êtes root, les fichiers en lecture seule sur les systèmes de fichiers inscriptibles sont accessibles en écriture, donc je ne vois pas le problème là. – Idelic

+0

Sur redhat 4 j'obtiens "while: Expression Syntaxe". – jgritty

0

Si vous voulez trouver tous les fichiers qui sont inscriptibles par etal apache alors vous pouvez le faire:

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

Remplacer les données www-avec personne ou apache ou quel que soit votre utilisateur Web est.

0

Je sais ce très vieux fil, mais ...

La commande ci-dessous m'a aidé: find . -type f -perm /+w

Vous pouvez utiliser -maxdepth en fonction du nombre de niveaux ci-dessous le répertoire que vous souhaitez rechercher. J'utilise Linux 2.6.18-371.4.1.el5.

Questions connexes