Manejo de nombres de archivos con primeros caracteres especiales (ej. ♫)

Manejo de nombres de archivos con primeros caracteres especiales (ej. ♫)

Recientemente me encontré con un archivo cuyo nombre comienza con el carácter '♫'. Quería copiar este archivo, introducirlo ffmpegy 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 !lsy 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. cpcrea enlaces simbólicos en lugar de copias con la opción -s( -lpara enlaces físicos).

Utilice "detox" para limpiar nombres

Para cambiar el nombre a nombres de archivos limpios,detoxpuede ser usado; Cambia el nombre de los archivos para limpiarlos de acuerdo con varias reglas definidas en undetoxrcarchivo. De forma predeterminada, los caracteres UTF8 simplemente se eliminan; Con la opción -s utf_8-onlyse 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

información relacionada