.png)
Recientemente me encontré con un archivo cuyo nombre comienza con el carácter '♫'. Quería copiar este archivo, introducirlo ffmpeg
y hacer referencia a él de otras formas en la terminal. Normalmente autocompletar nombres de archivos extraños, pero esto falla porque 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 a vim
, pegar !ls
y copiar el carácter en cuestión, luego salir y pegarlo en la terminal. Esto funcionó pero es bastante horrible.
¿Existe una manera más fácil de lidiar con tales escenarios?
NOTA:Estoy usando la concha de pescado si eso cambia las cosas.
Respuesta1
Si el primer carácter del nombre del archivo se puede imprimir pero no es alfanumérico ni espacios en blanco, puede utilizar [[:punct:]]
el operador global:
$ ls *.txt
f1.txt f2.txt ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt
Respuesta2
Lo más simple que se me ocurre es ls [^a-zA-Z0-9]*
y me funciona, pero la respuesta de terdon es mejor para llamar la atención sobre la opción de shell extglob o incluso un enfoque independiente del shell.
Respuesta3
ls tiene algunos modificadores (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 modificadores parece ayudar.
Por lo tanto, como método general de "fuerza bruta" para deshacerse de archivos con caracteres en sus nombres, puede hacer lo siguiente:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Busque la línea que contiene el archivo infractor. Es muy probable que sea la primera línea, pero digamos que es la quinta. Imprima la línea 5 y codifíquela en hexadecimal:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
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:
$ echo -e '\xe2\x99\xab'
♫
Ahora puedes copiarlo/moverlo/eliminarlo así:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Además, si no estás limitado a usar un script de shell, puedes hacerlo en Python de esta manera:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Con este enfoque, puede procesar muchos archivos, solo tiene que escribir la lógica para seleccionar los archivos correctos y cambiarles el nombre sin dañarlos, etc.:
for f in os.listdir('.'):
if not f.isalnum():
newname = generate_newname(f)
if not os.path.exists(newname):
shutil.copy(f, newname)
else:
print newname, 'already exists!'
Respuesta4
Cambiar el nombre de los enlaces simbólicos
Un enfoque para manejar nombres de archivos con caracteres especiales, como primeros caracteres o en cualquier otra parte del nombre del archivo, escambiar el nombre a nombres más simples.
Esto se puede utilizar incluso si es necesario.mantener los nombres de archivos originales: cambie el nombre de una copia de los nombres de archivo.
Esto se puede hacer copiando los archivos, pero también creandoenlaces simbólicos o enlaces durosa los archivos y cámbieles el nombre. cp
crea enlaces simbólicos en lugar de copias con la opción -s
( -l
para enlaces físicos).
Utilice "detox" para limpiar nombres
Para cambiar el nombre a nombres de archivos limpios,detox
puede ser usado; Cambia el nombre de los archivos para limpiarlos de acuerdo con varias reglas definidas en undetoxrc
archivo. De forma predeterminada, los caracteres UTF8 simplemente se eliminan; Con la opción -s utf_8-only
se reemplazan por _
:
$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only *
$ ls -1
_ ___
_foo
"desintoxicación" en enlaces simbólicos
Combinado con trabajar en enlaces simbólicos como se describe arriba:
$ mkdir orig
$ cd orig
$ touch '♫ 漢字カ' ♫foo
$ cd ..
$ mkdir clean
$ cd clean
$ cp -s ../orig/* .
$ ll
lrwxrwxrwx 1 14 Oct 8 05:52 ♫foo -> ../orig/♫foo
lrwxrwxrwx 1 21 Oct 8 05:52 ♫\ 漢字カ -> ../orig/♫\ 漢字カ
$ ls -1
♫foo
♫ 漢字カ
$ detox --special -s utf_8-only *
$ ll
lrwxrwxrwx 1 21 Oct 8 05:52 _\ ___ -> ../orig/♫\ 漢字カ
lrwxrwxrwx 1 14 Oct 8 05:52 _foo -> ../orig/♫foo