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:
- Abre Shortcuts, haz clic en el botón para añadir y asigna al atajo el nombre
Sort Extension Demo. - Busca
Run Shell Scripten la lista de acciones y añade esa acción. - Selecciona
/bin/bashcomo shell. Pega en el campo del script el bloque completo del clasificador de arriba, incluida la línea inicial/bin/bashy el delimitador finalBASH. Dejamode=previewal principio. - Añade
Quick Lookdespués de la acción del script y conéctalo a la salida del script. - 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
- Organizar archivos en Finder en Mac — Soporte técnico de Apple.
- Mostrar u ocultar las extensiones de archivo en Mac — Soporte técnico de Apple.
- ¿Qué es Terminal en Mac? — Soporte técnico de Apple.
- Gestionar archivos en Terminal en Mac — Soporte técnico de Apple.
- Manual de Bash — Distribuciones OSS de Apple.
- tr(1) — traducir caracteres — Distribuciones OSS de Apple.
- mkdir(1) — crear directorios — Distribuciones OSS de Apple.
- mv(1) — mover archivos — Distribuciones OSS de Apple.
- Conoce Shortcuts para macOS — Apple Developer.
- Crear un atajo personalizado en Mac — Soporte técnico de Apple.
- Probar tus acciones en Shortcuts en Mac — Soporte técnico de Apple.
- Recorrer la lista de acciones en Shortcuts en Mac — Soporte técnico de Apple.
- Configuración avanzada de privacidad y seguridad en Shortcuts en Mac — Soporte técnico de Apple.