Recientemente me encontré con un archivo cuyo nombre comienza con el carácter '♫'. Quería copiar este archivo, alimentarlo ffmpeg
y hacer referencia a él de varias otras maneras en el terminal. Por lo general, autocompleto nombres de archivo extraños, pero esto falla ya que ni siquiera puedo escribir la primera letra.
No quiero cambiar al mouse para realizar una maniobra de copiar y pegar. No quiero memorizar un montón de códigos para posibles escenarios. Mi solución ad hoc fue cambiar vim
, pegar !ls
y copiar el personaje en cuestión, luego salir y pegarlo en el terminal. Esto funcionó pero es bastante horrible.
¿Hay una manera más fácil de lidiar con tales escenarios?
NOTA: Estoy usando la concha de pescado si cambia las cosas.
command-line
filenames
wildcards
special-characters
fish
Código de circón
fuente
fuente
*restoffile.avi
¿o algo como esto?touch '♫ 漢字カ'
touch '♫ 漢字タ'
Respuestas:
Si el primer carácter del nombre del archivo se puede imprimir pero no es alfanumérico ni espacio en blanco, puede usar el
[[:punct:]]
operador glob:fuente
Lo más simple que se me ocurre es
ls [^a-zA-Z0-9]*
y me sirve, pero la respuesta de terdon es mejor para llamar la atención sobre la opción de shell extglob o incluso un enfoque independiente de shell.fuente
ls [^[:alnum:]]*
por lo mismo. Pero es mejor usar la clase de caracteres que es , en lugar de las clases que no lo son ; porls [[:punct:]]*
lo tanto , enumerará este archivo.ls tiene algunos interruptores (como --quote-name, --escape, --literal) para tratar con caracteres no imprimibles, pero en este caso parece que el carácter es "imprimible" pero no "escribible" (¡al menos en mi teclado! ), por lo que ninguno de estos interruptores parece ayudar.
Por lo tanto, como un enfoque general de "fuerza bruta" para deshacerse de los archivos con cualquier carácter en sus nombres, puede hacer esto:
Encuentra la línea que contiene el archivo ofensivo. Es muy probable que sea la primera línea, pero digamos que es la quinta. Imprima la línea 5 y la codifique hexadecimal:
Ignorando el carácter 0a (nueva línea), construya una cadena de escape y use la opción -e de echo para traducir los escapes:
Ahora puede copiarlo / moverlo / eliminarlo así:
Además, si no está limitado a usar el script de shell, puede hacerlo en Python de esta manera:
Con este enfoque, puede procesar muchos archivos, solo tiene que escribir la lógica para seleccionar los archivos correctos y renombrarlos sin tropezar, etc.
fuente
Un enfoque similar sería enumerar todos los archivos que no comienzan con caracteres "normales". En bash puedes hacer esto con
Sin embargo, eso no parece estar disponible
fish
, por lo que podría usarfind
en su lugar:fuente
Renombrar enlaces simbólicos
Un enfoque para manejar nombres de archivos con caracteres especiales, como primeros caracteres o en cualquier otra parte del nombre de archivo, es cambiar el nombre a nombres más simples .
Esto se puede usar incluso si necesita conservar los nombres de archivo originales : cambie el nombre de una copia de los nombres de archivo.
Eso se puede hacer copiando los archivos, pero también creando enlaces simbólicos o enlaces duros a los archivos, y renómbrelos.
cp
crea enlaces simbólicos en lugar de copias con la opción-s
(-l
para enlaces duros).Use "desintoxicación" para limpiar nombres
Para renombrar para limpiar nombres de archivos,
detox
se puede usar; Cambia el nombre de los archivos para limpiar los nombres de archivo de acuerdo con varias reglas definidas en undetoxrc
archivo. Por defecto, los caracteres UTF8 simplemente se eliminan; Con la opción-s utf_8-only
son reemplazados por_
:"desintoxicación" en enlaces simbólicos
Combinado con trabajar en enlaces simbólicos como se describe arriba:
fuente
No uso
fish
, pero la documentación dice que puede ingresar un carácter Unicode prefijando su código de caracteres hexadecimales con\u
(para caracteres de 16 bits) o\U
(para caracteres de 32 bits). Creo que el código para♫
es491eb
, así que podrías hacer:para cambiar el nombre
♫abc.mp3
.Tenga en cuenta que necesita los ceros a la izquierda, de lo contrario
abc
al final se tratarán como dígitos hexadecimales y parte del código de caracteres; para un carácter de 32 bits necesita ingresar 8 dígitos.fuente
No sé si ya era el caso en 2014 cuando hizo la pregunta, pero en las versiones actuales de
fish
(a partir de 2019), puede presionar Tabdos veces, para obtener una selección de estilo zsh donde puede usar las teclas de flecha para seleccione visualmente el archivo que desee sin tener que escribir ninguna parte del nombre del archivo.fuente
Fish no admite comodines de soporte ¹ por diseño.
El comando no busca en los directorios y muestra los nombres de archivos ocultos que no comienzan con los caracteres
letters
,digits
,.
_
-
(cf la documentación defind
).Nota:
$argv
es una variable de matriz especial (Fish shell) que contiene los argumentos de la función, por lo tanto, el comando subyacente puede recibir cualquier expresión (por ejemplo, alias ).¹ De hecho, Fish admite la expansión de soporte (expansión variable de matriz) pero Bash usa otra terminología (expansiones de parámetros y nombres de archivo).
fuente
Usa
zsh
y escribe lo que viene después. ZSH admite el autocompletado difuso y puede manejarlo. (Es especialmente agradable con el complemento OH-MY-ZSH ).fuente
No dijo si desea mantener estos nombres de archivo problemáticos. Una solución podría ser "solucionar" el problema de una vez por todas renombrando (algunos o todos) sus archivos a nombres que pueda escribir ejecutando este script:
Esto mostrará una lista de sus nombres de archivo existentes, cada uno seguido de
...?
. Simplemente escriba Enterpara dejar un archivo como está; o escriba un nuevo nombre para cambiarle el nombre. La-i
opción hará que le pida que confirme la sobrescritura si especifica el nombre de otro archivo existente.Este script se puede modificar de varias maneras:
*
) a algo más restrictivo, por ejemplo*.avi *.mov
, para que no tenga que mirar cada archivo.mv
acp
, por lo que conserva una copia del archivo con su nombre actual y crea una copia (¿temporal?) Con un nombre que se pueda escribir.Puede crear un nuevo nombre de archivo basado en el nombre de archivo existente. Por ejemplo,
que le permite colocar un prefijo delante del nombre anterior. Si elige un prefijo único, esto le permitirá usar el autocompletado.
fuente