Saltar al contenido

¿Eliminar espacios, guiones y guiones bajos en los nombres de archivo?

Después de de esta prolongada búsqueda de datos dimos con la solución esta incógnita que presentan ciertos usuarios. Te compartimos la respuesta y nuestro deseo es servirte de mucha ayuda.

Solución:

La versión de rename que viene con el perl el paquete admite expresiones regulares:

rename "s/[-_ ]//g" *

Alternativamente,

rename -i "s/[-_ ]//g" *

los -i la bandera hará rename use el modo interactivo, preguntando si el destino ya existe, en lugar de sobrescribir silenciosamente.

El cambio de nombre de Perl a veces se llama prename.

El cambio de nombre de Perl versus el cambio de nombre de util-linux

En sistemas similares a Debian, el cambio de nombre de perl parece ser el predeterminado y los comandos anteriores deberían funcionar.

En algunas distribuciones, el rename La utilidad de util-linux es la predeterminada. Esta utilidad es completamente incompatible con la de Perl. rename.

  • Todos: Primero, verifique si Perl rename está disponible bajo el nombre prename.

  • Debian: El cambio de nombre de Perl debería ser el predeterminado. También está disponible como prename. los rename ejecutable, sin embargo, está bajo el control de /etc/alternatives y así podría haber sido alterado a algo diferente.

  • archlinux: Correr pacman -S perl-rename y el comando está disponible como perl-rename. Para un nombre más conveniente, cree un alias. (Punta de sombrero: ChiseledAbs)

  • Mac OS X Según esta respuesta, rename se puede instalar en OSX usando homebrew a través de:

    brew install rename 
    
  • Descarga directa:rename también está disponible en Perl Monks:

     wget 'http://www.perlmonks.org/?displaytype=displaycode;node_id=303814' -O rename
    

Reemplazaría todos esos tr comandos, con un sed comando de sustitución, por ejemplo:

for file in %N; do 
    mv "$file" "$(echo "$file" | sed 's/[ _-]//g')"
done

Sin contar mv, realmente no necesita un proceso externo para esto en absoluto, puede simplemente maricón ellos.

ifsqz() ( LC_ALL=C sqz=$1
    isf()   
    set -- * ; set -f
    for f do isf "$f" || break
    IFS=$sqz; set -- $f; IFS=
    isf "$*" || mv -- "$f" "$*"
    done
)

Sin embargo, eso significa un mv invocación por archivo, y probablemente rename es mejor. Aunque esto debería funcionar dado solo un POSIX mv en $PATH y un shell POSIX.

Entonces, se me ocurrió una especie de demo loca para esto. El conjunto de prueba se genera como:

tee - - - - <0?(i+1):i))"'
   printf '%b -_   ---___'  $(
   IFS=0; eval 
       printf '"\\%04o\\%04o "' "$(
       printf "$n"' "$i" '%s $(
       printf %.252d
#END
))"))
CGEN

En primer lugar, seré el primero en reconocer que el comando anterior produce resultados que pueden obtenerse más fácilmente por otros medios. Pero es probable que otros medios no demuestren tan bien lo que se podría hacer con $IFS y un poco (¿enfermo?) imaginación.

Entonces, el primer bit es bastante sencillo:

  • tee envía 5 copias de su entrada, el documento llamado CGEN

  • dd bloquea su entrada por líneas nuevas a 90 bytes por bloque y canaliza eso a …

  • sed une 2 de esos bloques en dos npersonajes de ewline, 'entre comillas simples los resultados y antepone el string touch -- para cada ciclo de línea antes de conectar la tubería a …

  • sh que luego ejecuta todas las entradas como comandos de shell

los #CGEN aunque un poco … Bueno, brevemente …

  • El fondo printf imprime 252 0s

  • el siguiente del último recibe 252 '' null-string argumentos y para cada uno imprime el contenido de $n Seguido por el string " $i "

  • eval interpreta los argumentos del siguiente printf antes de que imprima los resultados de esa interpretación como números octales precedidos por 2 barras diagonales inversas por pieza

  • el último printf imprime los valores de bytes para esos octales 2 a la vez seguidos por el string -_ ---___ para cada par

  • $n se inicializa en una ecuación que incrementará $i por uno para cada evaluación, excepto que omite los valores 10, 39 o 47 – (que son newline, 'comillas simples, y /barra en decimal ASCII respectivamente)

El resultado final es un directorio que contiene una gran cantidad de nombres de archivo realmente feos que contienen cada byte en mi juego de caracteres de 1 a 255 excepto las comillas simples (solo se omite para evitar uno más sed s/// declaración) y el /barra oblicua. Esos nombres de archivo se ven así:

(set -- *; printf '%snn##############nn%sn' "$9" "$34")  | cat -A

   ---___ww -_   ---___xx -_   ---___yy -_   ---___zz -_   ---___ -_   ---___~~ -_   ---___^?^? -_   ---___M-^@M-^@ -_   ---___M-^AM-^A -_   ---___M-^BM-^B -_   ---___M-^CM-^C$
$
##############$
$
 -_   ---___M-ZM-Z -_   ---___M-[M-[ -_   ---___M-M- -_   ---___M-]M-] -_   ---___M-^M-^ -_   ---___M-_M-_ -_$
$
---___M-`M-` -_   ---___M-aM-a -_   ---___M-bM-b -_   ---___M-cM-c -_   ---___M-dM-d -_   ---___M-eM-e -_   ---___$

Ahora obtendré algunos datos sobre estos archivos:

chksqz() ( LC_ALL=C sqz=$1
    set -- * ; set -f ; IFS= ; tc="$*"
    printf '#%sn' 
        "There are $# files in this test directory." 
        "All filenames combined contain a total of $#tc bytes."
    IFS=$sqz ; set -- $* ; IFS= ; sc="$*"  
    printf "%s '$sqz'" 
        "#Of which $#sc bytes are not"
        " and $(($#tc-$#sc)) bytes are"
    set +f ; unset IFS
    printf ".n#%sn#Total:t%dn#Other:t%dn#'$sqz':t%dn" 
        "And to confirm these figures:" 
        $(  printf %s * | wc -c 
            printf %s * | tr -d "$sqz" | wc -c
            printf %s * | tr -dc "$sqz" | wc -c
))
chksqz '_ -'

PRODUCCIÓN

#There are 101 files in this test directory.
#All filenames combined contain a total of 17744 bytes.
#Of which 2692 bytes are not '_ -' and 15052 bytes are '_ -'.
#And to confirm these figures:
#Total: 17744
#Other: 2692
#'_ -': 15052

Está bien. Ahora, finalmente, a la acción:

ifsqz '_ -'
chksqz '_ -'

PRODUCCIÓN

#There are 101 files in this test directory.
#All filenames combined contain a total of 2692 bytes.
#Of which 2692 bytes are not '_ -' and 0 bytes are '_ -'.
#And to confirm these figures:
#Total: 2692
#Other: 2692
#'_ -': 0

¡Éxito! Puedes verlo por ti mismo:

ls

????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
???????????????????????????
???????????????????????????
???????????????????????????
????????????????????????????
????????????????????????????
????????????????
??????????????????????
????????????????????????
??????????????????????????
??????????????????????????
??????????????????????????
??????????????????????????
???????????????????????????
???????????????????????????
???????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
????????????????????????????
??????????????????????????
????????????????????????
????????????????????
??????????????????
????????????????????????????
??
????????????????????????????
??????????????????????????
????????????????????????????
????????????????????????????
????????????????????!!""##
??????????????????!!""##$$
????????????????!!""##$$%%
????????????!!""##$$%%&&((
????????!!""??##$$%%&&(())
$$%%&&(())**??++,,..0011
%%&&(())**++??,,..00112233
&&(())**++,,??..0011223344
))**++,,..??0011223344556
**++,,..00??11223344556677
22334455667788??99::;;<<==>>
445566778899??::;;<<==>>[email protected]@
5566778899::;;??<<==>>[email protected]@AA
6778899::;;<>[email protected]@AABB
8899::;;<<==??>>[email protected]@AABBCCDD
\]]^^``aa??bbccddeeffgghh
]]^^``aabbc??cddeeffgghhii
^^``aabbccdd??eeffgghhiijj
[email protected]@AABBCCDDEE??FFGGHHIIJJKK
AABBCCDDEEFF??GGHHIIJJKKLLM
BBCCDDEEFFGG??HHIIJJKKLLMMNN
CCDDEEFFGGHHII??JJKKLLMMNNOO
EEFFGGHHIIJJ??KKLLMMNNOOPPQQ
ffgghhiijjkk??llmmnnooppqqrr
gghhiijjkkllmm??nnooppqqrrss
iijjkkllmmnn??ooppqqrrsstt
jjkkllmmnnoo??ppqqrrssttuuvv
kkllmmnnooppqq??rrssttuuvvww
LLMMNNOOPPQQRR??SSTTUUVVWWXX
MNNOOPPQQRRSS??TTUUVVWWXXYY
OOPPQQRRSSTT??UUVVWWXXYYZZ[[
PPQQRRSSTTUUVV??WWXXYYZZ[[\
RRSSTTUUVVWW??XXYYZZ[[\]]
ssttuuvvwwxx??yyzz~~??
ttuuvvwwxxyyz??z~~????
uuvvwwxxyyzz??~~??????
wwxxyyzz??~~??????????
xxyyzz~~??????????????
YYZZ[[\]]^^??``aabbccddee
ZZ[[\]]^^``??aabbccddeeff

Si te gusta la programación, puedes dejar una crónica acerca de qué te ha parecido esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *