Crear nueva carpeta para cada archivo

He estado tratando de crear algún tipo de secuencia de comandos para automatizar el movimiento de alrededor de 408 elementos con un tamaño aproximado de 1,5 TB.

Lo que quiero hacer es crear una carpeta basada en el nombre del archivo, pero excluir la extensión, luego mover el elemento original con el mismo nombre a la carpeta. Todos los archivos tienen diferentes extensiones y también tienen puntos a lo largo del nombre. Debe ejecutarse como un script de shell o AppleScript, ya que se ejecutará bajo launchd después de que se realice el movimiento inicial para movimientos automáticos de archivos. ¿Hay una buena manera de hacer esto? (Incluso sin usar AppleScript). No me importa usar el shell o cualquier otro método que se sugiera.

Encontré esta publicación en StackOverflow, pero no pude darle mucho sentido, ya que parecía generar errores. Cualquier ayuda es apreciada. Los archivos tienen secuencias alfanuméricas y caracteres aleatorios en los nombres (creo que esto es lo que está llamando la atención en AppleScript.

Editar: Perdón por la espera... estaba en el trabajo.

Tener algo como:

Movies
    |- Anchorman.mkv
    |- Big Buck Bunny.mov
    |- Spy.mp4
    |- Shawshank Redemption.avi

Y me gustaría el resultado:

Movies 
   |- Anchorman *"This is a folder"*
       |- Anchorman.mkv *"This is the file"*
   |- Big Buck Bunny
       |- Big Buck Bunny.mov
   |- Spy
       |- Spy.ext
   |- Shawshank Redemption [1994](1080p)
       |- Shawshank Redemption [1994](1080p).avi
¿Podría proporcionar detalles más relevantes y reales? ¿Estos "408 elementos" están todos en la misma carpeta? ¿Son estos "elementos 408" todos los archivos con extensiones? ¿Las carpetas que se crearán en la misma carpeta existen los "408 elementos"? ¿Tiene que estar escrito AppleScript? Detalles, Detalles, Detalles!!!
Si todos los archivos están en el mismo directorio, entonces en Terminal, cdal directorio de destino y use este comando compuesto simple:for f in *.*; do mkdir "${f%.*}"; mv "$f" "${f%.*}"; done

Respuestas (2)

Asumiré que todos los 408 están en la misma carpeta y tienen extensión. Algo como esto:

Folder
|- File1.ext
|- File2.ext
|- File3.ext
|- File4.ext

Y quieres el siguiente resultado:

Folder 
|- File1 *"This is a folder"*
   |- File1.ext *"This is the file"*
|- File2
   |- File2.ext
|- File3
   |- File3.ext<br>
|- File4<br>
   |- File4.ext<br>

Si ese es el caso, puede hacerlo con la terminal con el siguiente comando (ejecútelo dentro de la carpeta donde se almacenan los archivos. Fallará al crear la carpeta para los archivos sin extensión):

for FILE in *; do FOLDER=$(echo $FILE | sed 's/\.[A-Za-z0-9]*$//'); mkdir "$FOLDER"; mv "$FILE" "$FOLDER" ; done
No sé quién lo rechazó, pero también lo habría hecho en bash y no en Applescript. Es mucho, mucho más eficiente.
@Allan, Desafortunadamente, al OP le faltan los detalles relevantes reales, sin embargo, es posible que haya sido rechazado porque, tal como está codificado, fallará en cualquier archivo que tenga una extensión que no sea con caracteres alfabéticos o si el nombre del archivo tiene espacios.
Sí, totalmente cierto. Fallará con algún tipo de archivos. Esperemos hasta que @bret7600 agregue más información.
Esto también se puede hacer de manera mucho más eficiente sin usar FOLDER=$(echo $FILE | sed 's/\.[A-Za-z]*$//'), usando la expansión de parámetros. Ver mi comentario al OP.
No sé nada sobre la expansión de parámetros. Me lo puedes explicar?
En Terminal, escriba, bashluego haga clic con el botón derecho en bashy seleccione Abrir página de manual. En la ventana de man bash, presione ⌘F y en el cuadro de texto Buscar: escriba: expansión de parámetros También haga clic en el botón Siguiente hasta llegar al tema Expansión de parámetros
La extensión de archivo puede tener otros caracteres que no sean alfanuméricos, entonces, ¿por qué encasillarse? Utilice la expresión regular \..*$para el patrón de búsqueda en sed. ¡Aunque, todo esto es discutible hasta que el OP defina las necesidades reales!
No fui yo quien votó negativo.

Como han respondido otros, es difícil saber exactamente lo que está buscando sin los detalles. Este AppleScript debería ser un buen punto de partida y puede modificarlo según sus necesidades. Le pedirá que identifique una carpeta que contenga los archivos que desea colocar en subcarpetas. He puesto una propiedad en la parte superior llamada removePeriods, que puede establecer en verdadero o falso (sin comillas). Si eso es cierto, eliminará todos los puntos del nombre del archivo y usará ese nombre para crear una carpeta. Por supuesto, puede modificarlo para que sea cualquier puntuación que desee. Además, podría hacer que elimine otros signos de puntuación también. Finalmente, toma el archivo y lo mueve a la nueva carpeta.

property rootFolder : ""
property removePeriods : true

--Assuming all the files you want to move are in one folder.
if rootFolder is "" then
    set rootFolder to choose folder
end if

--Get a list of every visible file in the folder (assuming you don't want to process hidden files)
tell application "System Events" to set myFiles to ¬
every file in rootFolder whose visible is true

repeat with aFile in myFiles
    --Get the file name
    set aName to name of aFile
    --If removePeriods property above is set to true, take all the periods out of the file name
    if removePeriods then
        set tid to text item delimiters
        set text item delimiters to "."
        if (count of text items of aName) is greater than 2 then
            set aName to text items 1 through ((count of text items of aName) - 1) of aName
        else
            set aName to text item 1 of aName
        end if
        set text item delimiters to tid
        set aName to every item of aName as text
    end if

--Make a new folder with the name of the file, inside the rootFolder (the original folder you selected
tell application "Finder"
    set newFolder to make new folder at rootFolder with properties {name:aName}
    move (aFile as alias) to newFolder
end tell

end repeat

Si tiene una carpeta dentro de carpetas, ese es otro nivel, pero se puede hacer con otro bucle. Si desea que todas las carpetas nuevas con archivos en ellas vayan a un lugar nuevo, solo necesita agregar esa ruta. Si desea eliminar solo el nombre antes del primer signo de puntuación para crear la carpeta, puede configurar un Nombre solo para el primer elemento de texto. Probablemente también desee agregar una verificación para asegurarse de que no haya una carpeta con el nombre que está creando.

EDITAR: a pedido de otro usuario, estoy agregando una nota para aclarar por qué configuré rootFolder en una propiedad en lugar de una variable estándar. En la foto de arriba, parece que todos los archivos del OP están en la carpeta de películas. Una propiedad, en AppleScript (y en términos simples), es una variable que se guarda (almacena) entre ejecuciones. Se guardará hasta que el script se vuelva a compilar, momento en el que se volverá a establecer en "". Una variable normal no tendrá memoria de una ejecución anterior del script. Elegí hacer de rootFolder una propiedad para que el usuario no tuviera que seleccionar manualmente la carpeta para procesar en cada ejecución, solo la primera ejecución. Sin embargo, puede reemplazar el principio de la secuencia de comandos a través del 'fin si' con las siguientes dos líneas de código:

set rootFolder to choose folder
set removePeriods to true

También puede codificar la ruta a la carpeta en lugar de que el usuario la seleccione. Hay muchas opciones. También debo decir nuevamente que este no es un script terminado destinado a un uso final, lo creé como un lugar para comenzar. Sin embargo, he usado esta base como parte de un script mucho más grande y complicado para reorganizar más de 500 000 archivos agrupados en carpetas con nombres únicos, por lo que confío en la estructura.

1. Si uno copia y pega el código , tal como está escrito, en el Editor de secuencias de comandos, ¡falla al compilar! 2. Debido a que rootFolderes una propiedad , no se solicita uno la próxima vez que se ejecuta porque el valor de una propiedad no se restablece a menos que se vuelva a compilar. No hay una buena razón para que sea una propiedad , debería ser una variable normal . Lo mismo se aplica a removePeriods.
Gracias por señalar que no compilaría. El sitio agregó un salto de línea duro cuando copié y pegué el código probado. Lo he editado para que sea un salto de línea suave, y ahora se compilará cuando se copie desde arriba. En cuanto a que rootFolder sea una variable estándar, no estoy de acuerdo. ¿Qué pasa si el usuario no quiere tener que decirle qué carpeta procesar cada vez? Lo configuré como una propiedad, porque en la pregunta del OP, parece que lo usará en la misma carpeta cada vez. Preguntar al usuario en ese caso es innecesario. Siéntase libre de modificar para su propio uso.
En cuanto a "porque en la pregunta del OP, parece que va a usar esto en la misma carpeta cada vez", eso puede no ser cierto, sin embargo, el OP fue escaso en detalles hasta que se editó e incluso entonces IMO podría haber Se agregaron más detalles. Le sugiero que modifique su respuesta para explicar lo que está sucediendo configurándola como una propiedad frente a una variable porque los usuarios que no están tan familiarizados con AppleScript se preguntarán por qué el cuadro de diálogo no vuelve a aparecer, a menos que se vuelva a compilar choose folder.