Cuando ejecuto este comando funciona:
$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst Outlook Data File Outlook Data File.sbd Trash Unsent Messages
Inbox.pst Outlook Data File.msf Sent.pst Trash.msf Unsent Messages.msf
Sin embargo, Al sustituir ls
con cd
sí no funciona:
$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory
Sé que cd
es un bash
built-in, así que probé esto lo que hace que no funciona bien:
$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory
¿Cómo puedo usar cd
junto con el find -exec
comando?
ACTUALIZAR
La razón por la que estoy tratando de utilizar cd
con find -exec
es que el nombre del directorio es extraña, que aparece en mi terminal como algo parecido ????
.
bash
find
cd-command
usuario3405291
fuente
fuente
LC_ALL=C printf '%q\n' *
imprimir nombres ASCII para todos los archivos en su directorio actual, uno a una línea (cambiando líneas nuevas$'\n'
o similares).Respuestas:
La
-exec
opción defind
ejecutar una utilidad externa, posiblemente con alguna opción de línea de comando y otros argumentos.Su Unix no se proporciona
cd
como una utilidad externa, solo como un shell incorporado, por lo quefind
no puede ejecutarlo. Al menos MacOS y Solaris no proporcionarcd
como una utilidad externa.Sería de poca o ninguna utilidad ejecutar
cd
de esta manera, excepto como una forma de probar si el nombre de ruta encontrado porfind
es un directorio en el que podría hacerlocd
. El directorio de trabajo en su shell interactivo (o lo que sea que esté llamandofind
) no cambiaría de todos modos.Relacionado:
Si tiene problemas con el nombre de un directorio que es extraño o extremadamente difícil de escribir, y desea cambiar a ese directorio, considere crear un enlace simbólico al directorio y luego
cd
usarlo en su lugar:Esto crearía un enlace simbólico llamado
thedir
que apuntaría al directorio problemático. Luego puede cambiar el directorio de trabajo con(si el enlace existe en el directorio actual). Esto evita modificar el directorio de ninguna manera. Otra idea sería cambiar el nombre del directorio de manera similar
find
, pero eso no sería aconsejable si otro programa espera que el directorio tenga ese nombre en particular.fuente
cd
confind -exec
es que los nombres de directorio son en algunos extraños personajes que no aparecen correctamente en mi terminal.cd
ingresar a un directorio que tiene un nombre incorrecto , y no puedocd
ingresarlo de manera normal./bin/cd
es el resultado de POSIX ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) donde las funciones normales deben estar accesibles para exec (). Por supuesto,/bin/cd
probablemente no haga lo que la gente quiere :-)find
ejecuta el-exec
comando en sí, no involucra un shell. Incluso si lo hiciera, el cambio de directorio solo persistiría hasta que salga ese shell, inmediatamente después delcd
.Tendrá que llevar el nombre del archivo al shell actual para que entre
cd
en él. Dependiendo de qué tan malos sean sus nombres de archivo, puede usar la sustitución de comandos:Eso no funcionará si el nombre de archivo termina en una nueva línea, ya que la sustitución de comandos se come en las nuevas líneas finales. En ese caso, deberá proteger la nueva línea y deshacerse de la que se
find
agrega al imprimir:O, con GNU
find
, haga que no imprima la nueva línea final (pero que aún proteja alguna en el nombre del archivo):También usando el
-quit
predicado (también una extensión GNU), para dejar de cuidar la primera coincidencia como una optimización.Alternativamente, puede iniciar un nuevo shell desde dentro
find
, pero es un poco feo:fuente
find
agrega al imprimir. Editadodir=$(find -print0)
que seguirá tirando la nueva línea del nombre del archivo ...No con el ejecutivo, pero esto puede ser lo suficientemente bueno para ti:
El "tipo d", solo para estar seguro. De qué, no sé realmente.
fuente
mkdir $'foo\n'
funciona perfectamente aquí; Todavía tengo que ver un sistema de archivos UNIX nativo donde no era compatible.Utilice una secuencia delimitada por NUL para leer la salida de
find
que funciona en todos los casos, incluidos los nombres que terminan en nuevas líneas. Además, puede usarprintf '%q'
para generar una representación legible de un nombre de archivo.fuente
Si recibe este mensaje, la plataforma de su sistema operativo tiene errores. El estándar POSIX requiere que un comando nombrado
cd
debe estar disponible en el sistema de archivos para que se pueda llamar a través deexec()
.Ahora las malas noticias para ti:
Incluso si su plataforma de sistema operativo no tenía errores, simplemente no vio una advertencia, pero no obtuvo los resultados esperados, ya que no le ayuda si un programa separado cambia su directorio de trabajo actual e inmediatamente muere después de eso.
Si desea tener un
cd
comando efectivo ejecutado porfind
, puede hacer algo como:fuente
sh
, no es algo que desee hacer. Es mejor evitar valores ficticios para ese script en línea,$0
ya que se usa en los mensajes de error, por ejemplo (como cuando esocd
fallaría).cd "$1"
? Si el nombre es difícil de escribir, también puede contener metacaracteres de shell ...