Para ordenar los archivos del nivel superior de Descargas en carpetas por extensión, usa un script que examine los archivos inmediatos, cree carpetas como txt y csv y omita los nombres de destino existentes. Empieza con el ejemplo desechable de abajo, previsualiza los movimientos y luego ejecútalo desde Terminal o Apple Shortcuts.

Esta guía está dirigida a quienes usan Mac y quieren mover físicamente los archivos sueltos a carpetas, dejando intactas las subcarpetas existentes y su contenido. La principal herramienta para decidir es un informe de vista previa: se propone un destino para cada archivo apto, mientras que las colisiones y los nombres no admitidos reciben un mensaje de omisión explícito.

¿Qué se moverá y qué permanecerá en su lugar?

Finder ofrece controles para ordenar y agrupar, además de carpetas y carpetas inteligentes. Apple explica que una carpeta inteligente muestra juntos los archivos que coinciden sin moverlos. Para esta tarea, el objetivo es crear carpetas reales por extensión que contengan los archivos movidos. Organizar archivos en Finder en Mac.

Antes de examinar el ejemplo, abre Finder y selecciona Finder > Ajustes > Avanzado; luego marca Mostrar todas las extensiones de archivo. Así se verán los sufijos que usa el clasificador. Mostrar una extensión no cambia el formato del archivo. Mostrar u ocultar las extensiones de archivo en Mac.

El siguiente script usa estas reglas deliberadas. Describen esta implementación, no un comportamiento universal de Finder o Shortcuts:

Elemento encontrado Comportamiento del clasificador
Un archivo inmediato normal como note.TXT Propone txt/note.TXT; conserva el nombre original del archivo
Un nombre compuesto como bundle.tar.gz Usa el sufijo final: gz/bundle.tar.gz
Un archivo sin punto o cuyo nombre termina en punto Lo deja en su lugar e informa que se omite
Una carpeta, incluso si su nombre tiene una extensión La deja en su lugar junto con su contenido
Un nombre que empieza por un punto Lo excluye del análisis
Un enlace simbólico Lo deja en su lugar
Una extensión que contiene caracteres distintos de letras y dígitos ASCII, o que supera los 32 caracteres La deja en su lugar e informa que se omite
Un destino existente con el mismo nombre de archivo Deja el archivo de origen en su lugar e informa de una colisión
Una carpeta de destino cuyo nombre está ocupado por un archivo normal o un enlace simbólico Informa que la carpeta está bloqueada y deja el archivo de origen en su lugar

Las restricciones de extensiones mantienen la regla para nombrar carpetas sencilla y predecible. Los archivos omitidos siguen disponibles para que decidas qué hacer manualmente; el script no inventa un nombre de reemplazo ni los descarta silenciosamente.

Crear un ejemplo desechable en Descargas

Abre Terminal y pega el siguiente bloque de configuración completo. Solo crea archivos de texto sintéticos dentro de Downloads/ExtensionSortDemo. Algunos tienen extensiones ilustrativas como .gz; su contenido es texto de muestra, no ejemplos de esos formatos. La configuración se detiene si esa carpeta de demostración ya existe, así que volver a ejecutarla no restablecerá una prueba anterior.

Apple documenta Terminal como una forma de ejecutar comandos y scripts de shell, y documenta mv para mover archivos locales. En este caso, Terminal ofrece una forma clara de previsualizar cada movimiento planificado antes de ejecutarlo. ¿Qué es Terminal en Mac?, Gestionar archivos en Terminal en Mac.

/bin/bash <<'BASH'
set -eu
demo="$HOME/Downloads/ExtensionSortDemo"
/bin/mkdir "$demo"
/bin/mkdir "$demo/nested" "$demo/txt"
printf 'sample text\n' > "$demo/sample.txt"
printf 'uppercase suffix example\n' > "$demo/note.TXT"
printf 'name,value\nblue,1\n' > "$demo/palette.csv"
printf 'synthetic compound-name example\n' > "$demo/bundle.tar.gz"
printf 'no extension example\n' > "$demo/README"
printf 'trailing dot example\n' > "$demo/trailing."
printf 'hidden example\n' > "$demo/.hidden.txt"
printf 'nested example\n' > "$demo/nested/inside.txt"
printf 'existing destination example\n' > "$demo/txt/sample.txt"
printf 'blocks creation of a csv folder\n' > "$demo/csv"
printf 'Created demo folder: %s\n' "$demo"
BASH

Abre Descargas en Finder y luego abre ExtensionSortDemo. Observa los dos archivos distintos llamados sample.txt: uno en el nivel superior de la carpeta de demostración y otro dentro de txt. Observa también que csv es un archivo. Son pruebas intencionales de dos motivos habituales para omitir un movimiento.

Previsualizar el clasificador antes de mover archivos

Pega el programa completo de abajo en Terminal. Su configuración inicial es mode=preview, así que informa de los movimientos propuestos sin crear carpetas por extensión ni mover archivos. La ruta raíz configurada es la carpeta de demostración desechable, no toda la carpeta Descargas.

/bin/bash <<'BASH'
set -u
export LC_ALL=C
unset GLOBIGNORE
shopt -s nullglob
shopt -u dotglob

root="$HOME/Downloads/ExtensionSortDemo"
mode=preview

case "$mode" in
  preview|move) ;;
  *) printf 'Invalid mode\n' >&2; exit 1 ;;
esac
if [ ! -d "$root" ] || [ -L "$root" ]; then
  printf 'Root must be an existing ordinary folder\n' >&2
  exit 1
fi
for file in "$root"/*; do
  if [ -L "$file" ] || [ ! -f "$file" ]; then
    printf 'SKIP non-regular: %q\n' "$file"
    continue
  fi
  name=${file##*/}
  case "$name" in
    *.*) ext=${name##*.} ;;
    *) printf 'SKIP no extension: %q\n' "$name"; continue ;;
  esac
  case "$ext" in
    ''|*[!A-Za-z0-9]*)
      printf 'SKIP unsupported extension: %q\n' "$name"
      continue ;;
  esac
  if [ "${#ext}" -gt 32 ]; then
    printf 'SKIP long extension: %q\n' "$name"
    continue
  fi
  ext=$(printf '%s' "$ext" | /usr/bin/tr '[:upper:]' '[:lower:]')
  folder="$root/$ext"
  dest="$folder/$name"
  if [ -L "$folder" ] || { [ -e "$folder" ] && [ ! -d "$folder" ]; }; then
    printf 'SKIP blocked folder: %q\n' "$folder"
    continue
  fi
  if [ -e "$dest" ] || [ -L "$dest" ]; then
    printf 'SKIP collision: %q\n' "$dest"
    continue
  fi
  if [ "$mode" = preview ]; then
    printf 'WOULD MOVE %q -> %q\n' "$file" "$dest"
    continue
  fi
  /bin/mkdir -p "$folder" || exit 1
  /bin/mv -n "$file" "$dest" || exit 1
  if [ -e "$file" ] || [ -L "$file" ]; then
    printf 'NOT MOVED: %q\n' "$file" >&2
    exit 1
  fi
  printf 'MOVED %q -> %q\n' "$file" "$dest"
done
printf 'Finished (%s). Review all SKIP lines.\n' "$mode"
BASH

El patrón de elementos inmediatos \"$root\"/* no desciende a los directorios. Las comprobaciones de archivos excluyen después los directorios y los enlaces simbólicos. nullglob gestiona una carpeta vacía sin tratar un patrón sin coincidencias como si fuera un nombre de archivo; desactivar dotglob excluye los nombres que empiezan por un punto. Estos comportamientos están documentados en el manual de Bash que distribuye Apple. Manual de Bash.

El script extrae el sufijo final y convierte sus letras a minúsculas con tr. Por eso, note.TXT conserva su nombre, pero va dentro de txt. El manual de tr de Apple documenta la conversión de mayúsculas a minúsculas que se usa aquí. tr(1) — traducir caracteres.

Para este conjunto de prueba, estos son los resultados previstos más importantes:

Archivo de origen sintético Resultado previsto de la vista previa
note.TXT Se movería a txt/note.TXT
bundle.tar.gz Se movería a gz/bundle.tar.gz
sample.txt Colisión con txt/sample.txt; se omite
palette.csv El nombre de carpeta csv está bloqueado por un archivo; se omite
README Sin extensión; se omite
trailing. Extensión vacía; se omite
nested/inside.txt Nunca se examina
.hidden.txt Nunca se examina

Estos son resultados previstos según el sistema de archivos, no una afirmación de que los movimientos se hayan ejecutado durante la preparación. El programa superó una comprobación de sintaxis de Bash, y una comprobación determinista aparte de la correspondencia de nombres confirmó la extracción del sufijo y su conversión a minúsculas. Este entorno de preparación era de solo lectura, por lo que no se ejecutó el flujo completo de movimiento en macOS.

Mover los archivos de ejemplo y comprobar el resultado

Cuando la vista previa coincida con la tabla, pega de nuevo el mismo programa completo, cambiando únicamente mode=preview por mode=move. Mantén la raíz de demostración sin cambios para esta prueba.

En el modo de movimiento, mkdir -p crea la carpeta necesaria o acepta un directorio existente. No convierte un archivo normal existente en una carpeta; por eso, el script comprueba primero la carpeta de destino. mkdir(1) — crear directorios.

El movimiento usa mv -n de macOS, cuyo comportamiento documentado es evitar sobrescribir archivos existentes. La comprobación previa de existencia proporciona un informe de colisión claro; la comprobación posterior del origen detecta si el archivo sigue allí después del intento de movimiento. El programa se detiene si un comando informa de un error. mv(1) — mover archivos.

Comprueba la carpeta de demostración en Finder. Deberías encontrar note.TXT dentro de txt y bundle.tar.gz dentro de una carpeta gz recién creada. Ambas versiones de sample.txt deberían seguir en sus ubicaciones originales. palette.csv debería permanecer en el nivel superior, y nested/inside.txt debería permanecer dentro de nested.

La línea final Finished indica que el análisis terminó; revisa también los mensajes de omisión. Si vuelves a ejecutar el clasificador, los archivos ya ordenados deberían permanecer dentro de sus carpetas porque esas carpetas no se analizan recursivamente.

Ejecutar el mismo clasificador desde Apple Shortcuts

Shortcuts puede servir como botón para este script. Apple documenta la compatibilidad integrada con la escritura y ejecución de scripts de shell en el editor de Shortcuts. El programa de shell realiza la asignación de extensiones y las comprobaciones de existencia; este artículo no presupone que una acción nativa para mover archivos tenga el mismo comportamiento ante colisiones. Conoce Shortcuts para macOS.

Crea el atajo manualmente y mantenlo apuntando a la carpeta de demostración durante las pruebas:

  1. Abre Shortcuts, haz clic en el botón para añadir y asigna al atajo el nombre Sort Extension Demo.
  2. Busca Run Shell Script en la lista de acciones y añade esa acción.
  3. Selecciona /bin/bash como shell. Pega en el campo del script el bloque completo del clasificador de arriba, incluida la línea inicial /bin/bash y el delimitador final BASH. Deja mode=preview al principio.
  4. Añade Quick Look después de la acción del script y conéctalo a la salida del script.
  5. Ejecuta el atajo y revisa el informe de vista previa antes de cambiar el script a mode=move.

Apple documenta cómo crear un atajo añadiendo acciones y probándolo, y recomienda Quick Look para revisar el contenido que se transmite entre acciones. Crear un atajo personalizado en Mac, Probar tus acciones en Shortcuts en Mac.

Este atajo no necesita archivos de entrada: la ruta raíz está definida dentro del script. El resultado correcto es un informe de texto que muestra Quick Look. Ese informe no es una colección de objetos de archivo movidos que se pueda pasar a otra acción de archivos. Para revisar qué entrada acepta una acción y qué salida produce en la versión instalada, haz clic en su icono con la tecla Control pulsada y selecciona Show Info, como documenta Apple. Recorrer la lista de acciones en Shortcuts en Mac.

Si Shortcuts exige que se habilite la ejecución de scripts, la ruta de configuración documentada por Apple es Shortcuts > Settings > Advanced > Allow Running Scripts. Si la acción de shell no está disponible en tu instalación, usa el programa completo de Terminal de arriba; realiza por sí solo la misma tarea de clasificación. Configuración avanzada de privacidad y seguridad en Shortcuts en Mac.

Aplicar la regla al nivel superior de Descargas

Después de la prueba desechable, el cambio de configuración para la carpeta Descargas real consiste en sustituir una sola línea dentro del clasificador. Este es un fragmento de configuración, no un programa de clasificación independiente:

root="$HOME/Downloads"

Vuelve a mode=preview cada vez que cambies la raíz. Revisa todos los destinos propuestos y los mensajes de omisión antes de habilitar los movimientos. El programa procesa juntos los archivos inmediatos aptos; no ofrece una solicitud para seleccionar archivos individualmente.

Úsalo como un lote iniciado manualmente en una carpeta cuyos archivos hayan terminado de llegar. El script no detecta cuándo termina una descarga, no supervisa las incorporaciones posteriores ni coordina ejecuciones simultáneas. Las comprobaciones y el movimiento son operaciones distintas, así que evita que otras actividades muevan archivos de esa carpeta mientras el script se ejecuta. La vista previa informa del estado actual; no reserva esos destinos.

Si hay una colisión, revisa ambos archivos en Finder y decide si cambias el nombre del archivo del nivel superior o lo dejas donde está. Si una carpeta por extensión está bloqueada, resuelve el problema con el elemento que ocupa ese nombre antes de volver a ejecutar el script. Ninguna de estas situaciones requiere cambiar el programa para sobrescribir archivos.

Termina revisando en Finder las carpetas de destino reales y comparando los archivos que queden en el nivel superior con el informe. El ejemplo desechable ofrece una prueba de aceptación concreta: los archivos previstos se mueven, los nombres existentes quedan intactos y el contenido de las subcarpetas permanece en su lugar original.

Fuentes