Encuentra un archivo por nombre usando la línea de comando

125

Me gustaría determinar la ubicación de un archivo usando la línea de comandos. Lo he intentado:

find . -type f -name "postgis-2.0.0"

y

locate postgis-2.0.0

inútilmente ¿Cuál es el comando para determinar el directorio del archivo, siempre que tenga su nombre?

    
pregunta Sam007 31.05.2012 - 19:02

7 respuestas

154

Pruebe find ~/ -type f -name "postgis-2.0.0" en su lugar.

El uso de . solo buscará en el directorio actual. ~/ buscará en su directorio de inicio completo (probablemente donde lo descargó). Si utilizó wget como root, es posible que esté en otro lugar, por lo que podría usar / para buscar en todo el sistema de archivos.

Goodluck

    
respondido por el adempewolff 31.05.2012 - 19:06
28

Lo intentaría:

sudo find / -type d -name "postgis-2.0.0"

El. significa buscar solo en el directorio actual, es mejor buscar todo desde la raíz si realmente no lo sabe. Además, escriba -f significa buscar archivos, no carpetas. Agregar sudo le permite buscar en todas las carpetas / subcarpetas.

Su sintaxis para locate es correcta, pero es posible que tenga que ejecutar

sudo updatedb

primero. Por alguna razón, nunca tuve buena suerte con locate though.

locate usa la base de datos de archivos y directorios hechos por updatedb . Entonces, si ha descargado un archivo nuevo, hay más posibilidades de que su updatedb no haya actualizado la base de datos de archivos y directorios. Puede usar sudo updatedb antes de usar el programa de utilidad locate . updatedb generalmente se ejecuta una vez al día solo en sistemas Linux.

    
respondido por el reverendj1 31.05.2012 - 19:12
11

find es una de las herramientas Linux / Unix más útiles.

Pruebe find . -type d | grep DIRNAME

    
respondido por el Mitch 31.05.2012 - 19:11
2

Las otras respuestas son buenas, pero me parece que omitir las declaraciones Permission denied me da respuestas más claras (omite stderr s debido a que no se ejecuta sudo ):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

donde:

  • / se puede reemplazar con el directorio desde el que desea iniciar su búsqueda
  • f se puede reemplazar con d si está buscando un directorio en lugar de un archivo
  • -iname puede reemplazarse con -name si desea que la búsqueda sea sensible a mayúsculas y minúsculas
  • el * s en el término de búsqueda puede omitirse si no desea los comodines en la búsqueda

Una alternativa es:

find / -type f 2>/dev/null | grep "postgis-2.0.0"

De esta forma, se obtienen resultados si el término de búsqueda coincide con cualquier parte de la ruta completa del archivo, p. /home/postgis-2.0.0/docs/Readme.txt

    
respondido por el zanbri 29.07.2016 - 17:35
2

Esto debería simplificar la localización del archivo:

Esto le daría la ruta completa al archivo

tree -f  / | grep postgis-2.0.0

Tree enumera los contenidos de los directorios en un formato arborescente. el -f dice a árbol que proporcione la ruta completa al archivo. ya que no tenemos idea de su ubicación o ubicación principal, es bueno buscar desde el sistema de archivos raíz / recursivamente hacia abajo. Luego enviamos la salida a grep para resaltar nuestra palabra, postgis-2.0.0

    
respondido por el ptetteh227 18.11.2017 - 04:16
1

Pruebe find . -name "*file_name*"

  • donde puedes cambiar '.' (mira en el Directorio actual) a '/' (mira en todo el sistema) o '~ /' (mira en el directorio de inicio).

  • donde puedes cambiar "-name" a "-iname" si no quieres distinguir entre mayúsculas y minúsculas.

  • donde puede cambiar " file_name " (un archivo que puede comenzar y terminar con lo que sea) al nombre exacto del archivo.

respondido por el RuiVBoas 13.03.2017 - 11:05
0

Si bien el comando find es la forma más simple de recorrer recursivamente el árbol de directorios, hay otras maneras y, en particular, los dos lenguajes de scripting que vienen con Ubuntu de forma predeterminada ya tienen la capacidad de hacerlo.

bash

bash tiene una muy buena opción de shell globstar , que permite el recorrido recursivo del árbol de directorios. Todo lo que tenemos que hacer es probar si el elemento en la expansión ./**/* es un archivo y si contiene el texto deseado:

bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done 
./testdir/texts/postgis-2.0.0

Perl

Perl tiene el módulo Buscar, que permite realizar un recorrido recursivo del árbol de directorios y, a través de la subrutina, realizar acciones específicas sobre ellos. Con una secuencia de comandos pequeña, puede recorrer el árbol de directorios, insertar archivos que contengan la cadena deseada en una matriz y luego imprimirla de esta manera:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;

my @wanted_files;
find(
     sub{ 
         -f $_ && $_ =~ $ARGV[0]  
               && push @wanted_files,$File::Find::name
     }, "."
);

foreach(@wanted_files){
    print "$_\n"
}

Y cómo funciona:

$ ./find_file.pl  "postgis-2.0.0"                                                       
./testdir/texts/postgis-2.0.0

Python

Python es otro lenguaje de scripting que se usa ampliamente en el mundo de Ubuntu. En particular, tiene el módulo os.walk() que nos permite realizar la misma acción que el anterior: árbol de directorio transversal y obtener una lista de archivos que contienen la cadena deseada.

Como una línea, esto se puede hacer así:

$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])'                                                                         
['./testdir/texts/postgis-2.0.0']

El script completo se vería así:

#!/usr/bin/env python
import os;

for r,s,f in os.walk("."):
    for i in f:
        if "postgis-2.0.0" in i:
            print(os.path.join(r,i))
    
respondido por el Sergiy Kolodyazhnyy 13.07.2017 - 04:23

Lea otras preguntas en las etiquetas