2009-02-01 36 views
23

Usando el shell tcsh en Free BSD, ¿hay alguna forma de enumerar recursivamente todos los archivos y directorios incluyendo el propietario, el grupo y la ruta relativa al archivo?Cómo recursivamente enumerar todos los archivos y directorios

ls -alR se acerca, pero no muestra la ruta relativa frente a cada archivo, se muestra el camino en la parte superior de una agrupación es decir

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 

Lo que me gustaría es una salida como:

owner group ./relative/path/to/file 

el accepted answer to this question muestra la ruta relativa a un archivo, pero no muestra el propietario y el grupo.

Respuesta

24

¿Qué tal esto:

find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}' 
+0

Parece que esto falla si hay espacios en la ruta porque awk creará otro campo. ¿Hay alguna forma de imprimir desde $ 9 hasta el final de la línea? – Ben

+0

¡Lo tienes! * Puedes * leer la salida de ls en una función, desplazarte a través de los argumentos y usar $ @ para leer "el resto de la línea", pero sinceramente, se está haciendo lo suficientemente complicado como para escribir una pequeña utilidad de Python y hágalo de la manera correcta en su lugar. –

+0

O pruebe una de las soluciones Perl sugeridas por Slim o Chris. –

10

find se acerca:

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

También hay "% P", que elimina el prefijo del nombre de archivo, si desea que los caminos que es relativa al directorio especificado.

Tenga en cuenta que esto es GNU find, no sé si el BSD find también admite -printf.

+1

BSD find de hecho no admite -printf, pero es bastante fácil instalar GNU find a ~/bin/gnufind;) –

-4

Utilice una secuencia de comandos de shell. O una secuencia de comandos Perl. Perl script de ejemplo (porque es más fácil para mí hacer):

#!/usr/bin/perl 
use strict; 
use warnings; 
foreach(`find . -name \*`) { 
    chomp; 
    my $ls = `ls -l $_`; 
    # an incomprehensible string of characters because it's Perl 
    my($owner, $group) = /\S+\s+\S+\s+(\S+)\s+(\S)+/; 
    printf("%-10s %-10s %s\n", $owner, $group, $_); 
} 

Tal vez un poco más detallado que las otras respuestas, pero debe hacer el truco, y debe ahorrará tener que recordar qué debe escribir. (Código no probado.)

+0

Parece que el OP quería una respuesta "[u] ca la shell tcsh en BSD libre". –

4

Si te apetece usar Perl, no lo uses como un contenedor de comandos de shell. Hacerlo en Perl nativo es más rápido, más portátil y más resistente. Además, evita expresiones regulares 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"; 
} 
18

Uso árbol. Pocas distribuciones de Linux lo instalan de manera predeterminada (en estos días oscuros de solo GUI :-), pero siempre está disponible en los repositorios estándar. Debe estar disponible para * BSD también, ver http://mama.indstate.edu/users/ice/tree/

Uso:

tree -p -u -g -f -i 

o

tree -p -u -g -f 

o comprobar la página del manual para muchos otros argumentos útiles.

6

ya tienes una respuesta que funciona, pero para referencia debe ser capaz de hacer esto en los BSD (Lo he probado en un Mac):

find . -ls 
14

Obras en Debian Linux:

find $PWD -type f  
+0

Funciona sin problemas en Mac OS X Mountain Lion también. Gracias. – Norris

+1

Si su ruta actual de directorio contiene espacios, rodee '$ PWD' con comillas dobles:' find "$ PWD" -type f' –

+0

Por si acaso, también funciona en Git Bash de GitHub para Windows. –

Cuestiones relacionadas