web-dev-qa-db-fra.com

Comment lister récursivement tous les fichiers et répertoires

En utilisant le shell tcsh sur Free BSD, existe-t-il un moyen de répertorier récursivement tous les fichiers et répertoires, y compris le propriétaire, le groupe et le chemin d'accès relatif au fichier?

ls -alR se rapproche, mais il n'affiche pas le chemin relatif devant chaque fichier, il montre le chemin en haut d'un regroupement, c'est-à-dire.

owner% ls -alR
total 0
drwxr-xr-x   3 owner  group  102 Feb  1 10:50 .
drwx------+ 27 owner  group  918 Feb  1 10:49 ..
drwxr-xr-x   5 owner  group  170 Feb  1 10:50 subfolder

./subfolder:
total 16
drwxr-xr-x  5 owner  group   170 Feb  1 10:50 .
drwxr-xr-x  3 owner  group   102 Feb  1 10:50 ..
-rw-r--r--  1 owner  group     0 Feb  1 10:50 file1
-rw-r--r--  1 owner  group     0 Feb  1 10:50 file2

Ce que je voudrais, c'est une sortie comme:

owner group ./relative/path/to/file

réponse acceptée à cette question montre le chemin relatif vers un fichier, mais ne montre pas le propriétaire et le groupe.

28
Ben

Que dis-tu de ça:

find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}'
25
James Brady

Utilisez l'arborescence . Peu de distributions Linux l'installent par défaut (dans ces jours sombres des seules interfaces graphiques :-), mais il est toujours disponible dans les référentiels standard. Il devrait également être disponible pour * BSD, voir http://mama.indstate.edu/users/ice/tree/

Utilisation:

tree -p -u -g -f -i

ou

tree -p -u -g -f

ou consultez la page de manuel pour de nombreux autres arguments utiles.

19
Davide

Fonctionne sous Linux Debian:

find $PWD -type f     
17
Аз_10000

find se rapproche:

find . -printf "%u %g %p\n"

Il existe également "% P", qui supprime le préfixe du nom de fichier, si vous souhaitez que les chemins d'accès soient relatifs au répertoire spécifié.

Notez que c'est GNU find, je ne sais pas si le BSD find prend également en charge -printf.

10
Torsten Marek

Vous avez déjà une réponse qui fonctionne, mais pour référence, vous devriez pouvoir le faire sur les BSD (je l'ai testée sur un mac):

find . -ls
8
Andrew

Si vous souhaitez utiliser Perl, ne l'utilisez pas comme un wrapper autour des commandes Shell. Le faire en Perl natif est plus rapide, plus portable et plus résistant. De plus, il évite les expressions régulières ad hoc.

use File::Find;
use File::stat;

find (\&myList, ".");

sub myList {
   my $st = lstat($_) or die "No $file: $!";

   print  getgrnam($st->gid), " ", 
          getpwuid($st->uid), " ", 
          $File::Find::name, "\n";
}
4
slim