¿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".

Yaqian Huang
fuente
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
slhck
fuente
¡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