¿Cómo eliminar por lotes las extensiones de archivo en mac usando csh o bash?


3

Agregué erróneamente la .dcmextensión en todos los archivos en mi Mac, lo que resultó en un error al iniciar sesión en mi iCloud y el almacenamiento de mis llaveros.

Habiendo estado tan desesperado por encontrar una solución para restaurar sus extensiones de archivo originales, pero solo encontré respuestas para reemplazar .abccon .defextensiones, que no es lo que quiero. Quiero eliminar toda la .dcmextensión redundante agregada en cada archivo.

¿Hay alguna manera de eliminar las extensiones .dcm en todos los archivos (recursivamente)?

Estas son las soluciones para reemplazar las extensiones de archivo que encontré:

for file in *.abc; do mv "$file" "${file%.abc}"; done
for old in *.abc; do mv $old basename $old .abc.ef; done

No son recursivos o Bash (3.2x) dice "mala sustitución" / "comando no encontrado".


1
Tengo curiosidad por saber qué respuestas encontró que explican cómo reemplazar algo, pero ¿qué no le permitiría simplemente eliminar la extensión?
slhck

varios ... ya que esas preguntas son sobre cómo reemplazar una extensión de archivo con otra como .abc a .def, las respuestas son como "para archivo en * .abc; do mv" $ archivo "" $ {archivo% .abc } .def "; hecho
Yaqian Huang

1
¿Se te ocurrió eliminar simplemente el .defde los ejemplos que encontraste? Bash no reemplaza nada aquí ... se elimina .abcy luego agrega .def. Entonces podría haber dejado de lado la parte "agregar .def".
slhck

Sí, y bash dice mala sustitución
Yaqian Huang

y esto tampoco es recursivo
Yaqian Huang

Respuestas:


4

Esto debería hacerlo:

find / -type f -name '*.dcm' -exec sh -c 'mv -- "$0" "${0%.dcm}"' {} \;

El comando:

  • Recurre desde /
  • Encuentra cada archivo llamado *.dcm
  • Ejecuta una pequeña llamada de subshell con un argumento, el nombre de archivo ( {})
  • ... que cambia el nombre del archivo ( $0) usandomv
  • eliminar la coincidencia más corta ( %) de .dcmusar la manipulación de cadenas

Pon un echofrente mvpara ver qué haría.

Si desea trabajar sin la subshell, puede canalizar a while:

find / -type f -name '*.dcm' -print0 | while IFS= read -r -d '' filename; do
  mv -- "$filename" "${filename%.dcm}"
done

¡Muchas gracias! Jugaré con eso un poco más. Y acabo de encontrar otra solución de trabajo: find / path / to / your / files -name '* .dcm' | mientras lee fname; do mv "$ fname" "$ {fname% .dcm}" hecho
Yaqian Huang

Esto también es bueno, pero no tan robusto. Vea mi respuesta para una mejor solución que maneje todo tipo de espacios en blanco posibles en los nombres de archivo. (Bash es raro, pero es obligatorio: unix.stackexchange.com/questions/9496/… )
slhck

Hay una línea durante la ejecución que dice: override r-------- Apple/staff for /Users/Apple/Library/Keychains/.fl0D1D1BA9? (y/n [n])No entiendo el contenido. Supongo que debería golpear [n]?
Yaqian Huang

Sí, y el que tiene echoobras increíbles!
Yaqian Huang
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.