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

183

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

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

y

locate postgis-2.0.0

en vano. ¿Cuál es el comando para determinar el directorio del archivo, dado su nombre?

Sam007
fuente
2
el locatecomando está bien, solo actualice el ubicaciónb primero, usando el comandoupdatedb
thucnguyen
Si ya está instalado, es posible que el nuevo nombre de archivo ya no lo sea postgis-2.0.0. Por lo general, después de las instalaciones a través de los administradores de paquetes, los ejecutables estarían en una de las $PATHcarpetas, intente which postgisver la ubicación. Si no devuelve nada, solo entonces debe buscar manualmente la ubicación del archivo.
sdkks

Respuestas:

232

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

El uso .solo buscará en el directorio actual. ~/buscará en todo su directorio de inicio (probablemente donde lo descargó). Si lo usó wgetcomo root, es posible que pueda estar en otro lugar para poder /buscar en todo el sistema de archivos.

Buena suerte

adempewolff
fuente
1
oh ya lo usé wgetcomo root, así que /funcionó, gracias
Sam007
para obtener más información, consulte este enlace help.ubuntu.com/community/find
habibun
Obtengo find: / Users / UserName // Library / Guardado estado de la aplicación / com.bitrock.appinstaller.savedState: error de permiso denegado. aparece en cada ejecución del comando. Cómo deshacerse de él?
Eduard
29

Lo intentaré:

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

Los . 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 le sudopermite buscar en todas las carpetas / subcarpetas.

Su sintaxis locatees correcta, pero es posible que deba ejecutar

sudo updatedb

primero. Sin locateembargo , por alguna razón, nunca tengo buena suerte .

locateutiliza la base de datos de archivos y directorios creados por updatedb. Entonces, si ha descargado un nuevo archivo, hay más posibilidades de que updatedbno haya actualizado la base de datos de archivos y directorios. Puede usar sudo updatedbantes de usar el locateprograma de utilidad. updatedbgeneralmente se ejecuta una vez al día por sí solo en sistemas Linux.

reverendj1
fuente
14

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

Tratar find . -type d | grep DIRNAME

Mitch
fuente
¿Hay alguna ventaja aquí para usar grep over -name?
TryHarder
@oooooo Agregué una razón en mi respuesta a continuación
zanbri
find plus grep fue lo único que funcionó para mí
malhal 02 de
12

Las otras respuestas son buenas, pero creo que omitir Permission denieddeclaraciones me da respuestas más claras (omite stderrs debido a que no se ejecuta sudo):

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

dónde:

  • / se puede reemplazar con el directorio desde el que desea comenzar su búsqueda
  • fpuede reemplazarse dsi está buscando un directorio en lugar de un archivo
  • -inamepuede reemplazarse -namesi desea que la búsqueda distinga entre mayúsculas y minúsculas
  • los *s en el término de búsqueda se pueden omitir 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 devuelven resultados si el término de búsqueda coincide en cualquier lugar de la ruta completa del archivo, por ejemplo /home/postgis-2.0.0/docs/Readme.txt

zanbri
fuente
2
Hay -regexe -iregexinterruptores para buscar Regular Expressions, que también encontrarían las rutas mencionadas. La sugerencia de encontrar cualquier elemento que sea un archivo ( -type f) grepes más costoso en recursos. Permission deniedsucede cuando el usuario no tiene acceso a archivos o carpetas, el uso sudoantes de find permitirá que find vea todos los archivos.
sdkks
1
Es bueno saber acerca de los interruptores regex, gracias.
zanbri
@zanbri Use -wholenameo en -iwholenamelugar de canalizar a grep.
wjandrea
4

Tratar find . -name "*file_name*"

  • donde puede cambiar '.' (busque en el Directorio actual) a '/' (busque en todo el sistema) o '~ /' (busque en el Directorio de inicio).

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

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

RuiVBoas
fuente
3

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 el contenido de los directorios en un formato similar a un árbol. el -fárbol le dice que dé la ruta completa al archivo. Como no tenemos idea de su ubicación o ubicación principal, es bueno buscar desde la raíz del sistema de archivos de forma /recursiva hacia abajo. Luego enviamos la salida a grep para resaltar nuestra palabra,postgis-2.0.0

ptetteh227
fuente
0

Si bien el findcomando es la forma más simple de atravesar recursivamente el árbol de directorios, existen otras formas y, en particular, los dos lenguajes de script que vienen con Ubuntu de manera predeterminada ya tienen la capacidad de hacerlo.

golpetazo

bash tiene una globstaropción de shell muy agradable , que permite un 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 una subrutina, realizar acciones específicas sobre ellos. Con un pequeño script, puede atravesar el árbol de directorios, insertar archivos que contienen la cadena deseada en la matriz y luego imprimirlo de la siguiente 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 como funciona:

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

Pitón

Python es otro lenguaje de script que se usa ampliamente en el mundo de Ubuntu. En particular, tiene un os.walk()módulo que nos permite realizar la misma acción que antes: recorrer el árbol de directorios y obtener una lista de los 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 guión 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))
Sergiy Kolodyazhnyy
fuente
0

$ find . -type f | grep IMG_20171225_*
Da
./03-05--2018/IMG_20171225_200513.jpg
el DOT después del comando findpara establecer un punto de partida, por lo
tanto, la carpeta actual,
"canalizada" (= filtrada) a través del filtro de nombreIMG_20171225_*

Jadeye
fuente