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 lscon cdsí no funciona:
$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory
Sé que cdes un bashbuilt-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 cdjunto con el find -execcomando?
ACTUALIZAR
La razón por la que estoy tratando de utilizar cdcon find -execes 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
-execopción defindejecutar una utilidad externa, posiblemente con alguna opción de línea de comando y otros argumentos.Su Unix no se proporciona
cdcomo una utilidad externa, solo como un shell incorporado, por lo quefindno puede ejecutarlo. Al menos MacOS y Solaris no proporcionarcdcomo una utilidad externa.Sería de poca o ninguna utilidad ejecutar
cdde esta manera, excepto como una forma de probar si el nombre de ruta encontrado porfindes 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
cdusarlo en su lugar:Esto crearía un enlace simbólico llamado
thedirque 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
cdconfind -execes que los nombres de directorio son en algunos extraños personajes que no aparecen correctamente en mi terminal.cdingresar a un directorio que tiene un nombre incorrecto , y no puedocdingresarlo de manera normal./bin/cdes el resultado de POSIX ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) donde las funciones normales deben estar accesibles para exec (). Por supuesto,/bin/cdprobablemente no haga lo que la gente quiere :-)findejecuta el-execcomando 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
cden é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
findagrega 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
-quitpredicado (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
findagrega 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
findque 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
cddebe 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
cdcomando 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,$0ya que se usa en los mensajes de error, por ejemplo (como cuando esocdfallaría).cd "$1"? Si el nombre es difícil de escribir, también puede contener metacaracteres de shell ...