Quiero encontrar un archivo y luego ingresar al directorio que lo contiene. Lo intenté find /media/storage -name "Fedora" | xargs cdpero, por supuesto, el is not a directoryerror.
¿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 cdno puede funcionar.cdsolo puede funcionar como un shell incorporado, ya que tiene que modificar el contexto del shell en sí. No hay forma de que unxargsproceso secundario pueda hacer eso. IDK si eso es lo que quiso decir con "por supuesto", o si la ruta que sefindimprime contiene espacios, que se dividen en xargs ya que no los usó-d \nni nada. Ofind -exec {} \;.cdasí.cdes un bash incorporado, sicdfuera 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
-quitdebe evitar que varios argumentos quecden el caso de más de un archivo coincide.fuente
-quittampoco 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 lofindadmite, como GNU o FreeBSDfind) en combinación conpwd:-quites opcional en caso de que solo haya un único resultado y rastrear todo el directorio no sea un problema. En NetBSD es-exity en OpenBSD no existe.fuente
\;?-execque dicefindsobre el final de los parámetros para que se ejecute el comando. Pero dado que queremos llamarpwdsin parámetros aquí, ponemos el\;derecho después.findimplementaciones 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/-exiten 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
cden 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 elDcalificador 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/storageantes de regresar.fuente
cdcon 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.dirnameimplementaciones 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'scdaceptarán más de un argumento depende de la forma en que fue compilado (CD_COMPLAINSenconfig-top.h). Uno puede imaginar que las versiones futuras debasheventualmente también implementarán las dos características arg como en zsh."${target%*/}"expande solo al primer elemento de matriz (con el/Fedoradespojado). Creo que esa versión es completamente robusta contra cualquier posible personaje en la ruta.