Quiero encontrar un archivo y luego ingresar al directorio que lo contiene. Lo intenté find /media/storage -name "Fedora" | xargs cd
pero, por supuesto, el is not a directory
error.
¿Cómo ingreso su directorio padre con un comando de una línea?
shell
find
xargs
cd-command
Hrvoje T
fuente
fuente
shopt -s globstar
, podríacd /media/storage/**/Fedora
, pero eso no deja de evaluar el glob en la primera coincidencia (por lo que es más lento que la solución de Steeldriver. Para uso interactivo, lo que normalmente haría es alcanzar el mouse y copiar / pegar el nombre del directorio, (y alt + retroceso según sea necesario para quitar los componentes de ruta de acceso que no quería), pero si haces esto mucho, supongo que valdría la pena hacer una función de shell.xargs cd
no puede funcionar.cd
solo puede funcionar como un shell incorporado, ya que tiene que modificar el contexto del shell en sí. No hay forma de que unxargs
proceso secundario pueda hacer eso. IDK si eso es lo que quiso decir con "por supuesto", o si la ruta que sefind
imprime contiene espacios, que se dividen en xargs ya que no los usó-d \n
ni nada. Ofind -exec {} \;
.cd
así.cd
es un bash incorporado, sicd
fuera un comando separado, entonces cambiaría (su propio) directorio, y luego se cerraría (regresando al shell, que está en el mismo estado que antes, sin cambio de directorio).Respuestas:
Al menos si tiene GNU
find
, puede usar-printf '%h'
para obtener el directorioEntonces probablemente podrías hacer
El
-quit
debe evitar que varios argumentos quecd
en el caso de más de un archivo coincide.fuente
-quit
tampoco es necesariamente compatible. En NetBSD se llama-exit
, consulte unix.stackexchange.com/a/62883/117599Similar a la solución de steeldriver pero usando
-execdir
(si lofind
admite, como GNU o FreeBSDfind
) en combinación conpwd
:-quit
es opcional en caso de que solo haya un único resultado y rastrear todo el directorio no sea un problema. En NetBSD es-exit
y en OpenBSD no existe.fuente
\;
?-exec
que dicefind
sobre el final de los parámetros para que se ejecute el comando. Pero dado que queremos llamarpwd
sin parámetros aquí, ponemos el\;
derecho después.find
implementaciones que admitan execdir pero no-printf %h
? Me parece poco probable. Lamentablemente, POSIX no requiere ninguno: /find
: freebsd.org/cgi/man.cgi?find%281%29 (Acabo de confirmarlo en una instalación de FreeBSD 11.)-quit
/-exit
en absoluto.Puede hacer que find ejecute un nuevo shell en el directorio que encuentre.
, después de lo cual el directorio actual será el que tenga un archivo llamado Fedora. ;)
Obviamente, esto solo hace algo parecido a lo que desea si está escribiendo comandos de forma interactiva.
fuente
Con
zsh
:que
cd
en el primer directorio (en orden alfabético) que contiene un archivo llamadoFedora
.**
: cualquier nivel de directorios (los directorios ocultos se omiten de forma predeterminada, use elD
calificador global para incluirlos)[1]
: solo el primero:h
: modificador de cabeza : toma el nombre del directorio.Al contrario
cd "$(find ...)"
, también funciona si el nombre del directorio termina en un carácter de nueva línea. Otra ventaja es que se obtendría un partido sin mensaje de error cuando no hay coincidencia de directorio (mientras que en la mayoría de los proyectilescd ""
no haría nada en silencio).Un inconveniente es que se arrastraría todo
/media/storage
antes de regresar.fuente
cd
con múltiples argumentos solo mira el primer argumento de todos modos, porcd $(dirname /media/storage/**/Fedora)
lo que funcionaría (conshopt -s globstar
) si no hay espacios en la ruta. Para conseguirlo citado correctamente, creo que una matriz bash es más fácil:target=(/media/storage/**/Fedora); cd "${target%/*}"
. Pero en ese punto habría sido más rápido usar el mouse para copiar / pegar resultados de búsqueda en lugar de crearlos de forma interactiva.dirname
implementaciones no aceptarán más de un argumento. Tenga en cuenta que no son espacios , es cualquier carácter actualmente en$IFS
(espacio, tabulación y nueva línea por defecto) y caracteres comodín. Tenga en cuenta que sibash
'scd
aceptarán más de un argumento depende de la forma en que fue compilado (CD_COMPLAINS
enconfig-top.h
). Uno puede imaginar que las versiones futuras debash
eventualmente también implementarán las dos características arg como en zsh."${target%*/}"
expande solo al primer elemento de matriz (con el/Fedora
despojado). Creo que esa versión es completamente robusta contra cualquier posible personaje en la ruta.