2008-10-29 20 views
188

Esto es similar a this question, pero quiero incluir la ruta relativa al directorio actual en Unix. Si hago lo siguiente:Lista de archivos recursivamente en Linux CLI con ruta relativa al directorio actual

ls -LR | grep .txt 

No incluye las rutas completas. Por ejemplo, tengo la siguiente estructura de directorios:

test1/file.txt 
test2/file1.txt 
test2/file2.txt 

El código anterior devolverá:

file.txt 
file1.txt 
file2.txt 

¿Cómo puedo conseguir que se incluyen las rutas relativas al directorio actual utilizando comandos estándar Unix?

+3

Esto simplemente muestra que falta esta característica. –

+0

Es una pena que todas estas soluciones requieran 'encontrar' o' árbol'. Estoy haciendo ssh'ing en un dispositivo Android donde parece que solo tengo 'ls', y ninguna de estas otras herramientas:/ – Ponkadoodle

Respuesta

254

Uso hallazgo:

find . -name \*.txt -print 

En los sistemas que utilizan GNU encontrar, como la mayoría de las distribuciones de GNU/Linux, se puede dejar de lado el -print.

+8

... y para el caso, puede omitir el '.' –

+4

Para rutas absolutas, use 'find $ (pwd) -name \ *. Txt' – Zags

+1

Si el patrón tiene parte del nombre del directorio debe usar' -path "* docs/*. Txt" 'en lugar de' -name'. '-wholename' es lo mismo que' -path' – dashesy

23

Pruebe find. Puede mirar hacia arriba exactamente en la página del manual, pero es sorta como esto:

find [start directory] -name [what to find]

así por su ejemplo

find . -name "*.txt"

debe darle lo que quiere.

9

Se puede utilizar la función Buscar en su lugar:

find . -name '*.txt' 
4
DIR=your_path 
find $DIR | sed 's:""$DIR""::' 

resultados 'sed' borrará 'your_path' de todo 'encontrar'. Y recibe en relación a la ruta 'DIR'.

+0

esto es exactamente lo que necesito, pero todavía escupe el camino completo para mí? – v3nt

+1

No use el apóstrofo - find/tmp | sed s: "/ tmp" :: | más –

1

Aquí es un script de Perl:

sub format_lines($) 
{ 
    my $refonlines = shift; 
    my @lines = @{$refonlines}; 
    my $tmppath = "-"; 

    foreach (@lines) 
    { 
     next if ($_ =~ /^\s+/); 
     if ($_ =~ /(^\w+(\/\w*)*):/) 
     { 
      $tmppath = $1 if defined $1;  
      next; 
     } 
     print "$tmppath/$_"; 
    } 
} 

sub main() 
{ 
     my @lines =(); 

    while (<>) 
    { 
     push (@lines, $_); 
    } 
    format_lines(\@lines); 
} 

main(); 

de uso:

ls -LR | perl format_ls-LR.pl 
+0

Este es un programa terrible de Perl. Probablemente es 2-3 veces más largo y complicado de lo necesario. –

59

Uso tree, con -f (ruta completa) y -i (sin líneas de sangría):

tree -if --noreport . 
tree -if --noreport directory/ 

A continuación, puede usar grep para filtrar los que desee.


Si no se encuentra el comando, se puede instalar:

Tipo siguiente comando para el comando de instalación árbol en RHEL/CentOS y Fedora Linux:

# yum install tree -y 

Si está utilizando Debian/Ubuntu, Mint Linux escriba el siguiente comando en su terminal:

$ sudo apt-get install tree -y 
+1

¿Alguna configuración para mostrar solo los archivos y excluir carpetas? – thebugfinder

1

Puede crear comió una función de shell, p.en su .zshrc o .bashrc:

filepath() { 
    echo $PWD/$1 
} 

filepath2() { 
    for i in [email protected]; do 
     echo $PWD/$i 
    done 
} 

La primera de ellas sería trabajar en archivos individuales solamente, obviamente.

4

para obtener los nombres de los archivos ruta completa reales de los archivos deseados utilizando el comando find, lo uso con el comando pwd:

find $(pwd) -name \*.txt -print 
1

Encuentra el archivo llamado "nombre de archivo" en su sistema de archivos de iniciar la búsqueda de la directorio raíz "/". El "nombre de archivo"

find/-name "filename" 
1

Si desea conservar los datos vienen con ls como el tamaño del archivo etc en su salida, entonces esto debería funcionar.

sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file 
0

se puede implementar esta funcionalidad como esta
En primer lugar, utilizando el comando ls señaló al directorio de destino. Más tarde, utilizando el comando find, filtra el resultado. Desde su caso, que suena - siempre el nombre del archivo comienza con una palabra file***.txt

ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search) 
5

Eso hace el truco:

ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"

Pero sí que para el "pecado" con el análisis sintáctico de ls, lo que las comunidades GNU y Ghostscript consideran mala forma.

+0

Realmente no entiendo la última frase ... – CAFEBABE

+2

@CAFEBABE: se considera tabú analizar los resultados de 'ls' porque generalmente conduce a errores. La oración en cuestión intentaba llamar a eso. También tenía una broma que he eliminado. –

Cuestiones relacionadas