Llegó el día en que tuve que escribir un script de BASH que recorre árboles de directorios arbitrarios y mira archivos arbitrarios e intenta determinar algo con respecto a una comparación entre ellos. Pensé que sería un simple par de horas tops! proceso - ¡No es así!¿Hay un "convertidor de escape" para los nombres de archivos y directorios disponibles?
Mi cuelgue es que algunas veces un idiota -ejemplo! - discúlpeme, el encantador usuario elige poner espacios en el directorio y los nombres de los archivos. Esto hace que mi script falle.
La solución perfecta, además de amenazar la guillotina para aquellos que insisten en el uso de espacios en esos lugares (por no hablar de los tipos que ponen esto en código de los sistemas operativos!), Podría ser una rutina que 'se escapa' los nombres de archivos y directorios para nosotros, algo así como cómo cygwin tiene rutinas para convertir de unix a dos formatos de archivo. ¿Hay algo como esto en una distribución estándar de Unix/Linux?
Nota que el simple for file in *
constructo no funciona tan bien cuando uno está tratando de comparar los árboles de directorios ya que las SOLO trabajos sobre "el directorio actual" - y, en este caso, como en muchos otros, constantemente a CDing varias ubicaciones de directorio trae consigo sus propios problemas. Así pues, en hacer mi tarea, me encontré con esta pregunta Handle special characters in bash for...in loop y la solución propuesta no cuelga en espacios en los nombres de directorio, sino que simplemente se pueden superar de esta manera:
dir="dirname with spaces"
ls -1 "$dir" | while read x; do
echo $x
done
POR FAVOR: El código anterior ISN' Es particularmente maravilloso porque las variables utilizadas dentro del ciclo while son INACCESIBLES fuera de ese ciclo while. Esto se debe a que hay una subshell implícita creada cuando la salida del comando ls está canalizada. ¡Este es un factor de motivación clave para mi consulta!
... OK, el código anterior ayuda en muchas situaciones, pero "escapar" de los personajes también sería muy poderoso. Por ejemplo, el directorio anterior puede contener:
dir\ with\ spaces
¿Esto ya existe y acabo de pasarlo por alto?
Si no es así, ¿alguien tiene una propuesta fácil para escribir una, quizás con sed o lex? (Estoy lejos de ser competente con cualquiera.)
Bash debe tener una internamente, ya que se usa cada vez que tocas "tab", por lo que podría ser un punto de partida. – Ken
Estoy de acuerdo y me encantaría aprovecharlo directamente, ¡si hubiera alguna manera! Hmmm ... Tal vez algunos de nuestros amigos de Código Abierto lo consideren una digna adición al caparazón mismo. Podría argumentarse que las "actualizaciones" originales para permitir espacios (en particular) son incompletas sin dicha herramienta. ... Mientras tanto, ¡no tengo idea de cómo replicar programáticamente la acción de la pestaña! ¿Tú? –
No estoy seguro de entender su necesidad. Por lo general, usar 'find' y un' while' loop es más que suficiente. Tal vez podrías publicar algún código con el que estés teniendo problemas. –