linux - subdirectorios - Cómo recursivamente enumerar todos los archivos y directorios
renombrar archivo linux (7)
Qué tal esto:
find . -exec ls -dl /{/} /; | awk ''{print $3, $4, $9}''
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?
ls -alR se acerca, pero no muestra la ruta relativa delante de cada archivo, muestra la ruta 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 salida como:
owner group ./relative/path/to/file
La respuesta aceptada a esta pregunta muestra la ruta relativa a un archivo, pero no muestra el propietario y el grupo.
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";
}
Use un script de shell O una secuencia de comandos Perl. Ejemplo de script de Perl (porque es más fácil para mí):
#!/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 debería hacer el truco, y debería ahorrarle tener que recordar qué escribir. (Código no probado)
find
se acerca:
find . -printf "%u %g %p/n"
También hay "% P", que elimina el prefijo del nombre de archivo, si desea que las rutas sean relativas al directorio especificado.
Tenga en cuenta que esto es GNU find, no sé si el BSD find también admite -printf.
Usa el árbol . Pocas distribuciones de Linux lo instalan por defecto (en estos días oscuros de solo GUI :-), pero siempre está disponible en los repositorios estándar. Debería estar disponible para * BSD también, ver http://mama.indstate.edu/users/ice/tree/
Utilizar:
tree -p -u -g -f -i
o
tree -p -u -g -f
o revise la página man para muchos otros argumentos útiles.
Ya tienes una respuesta que funciona, pero como referencia deberías poder hacer esto en los BSD (lo he probado en un Mac):
find . -ls
Funciona en Linux Debian:
find $PWD -type f