Crear una nueva carpeta para cada archivo

1

He estado intentando crear algún tipo de script para automatizar el movimiento de alrededor de 408 elementos con un tamaño de aproximadamente 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 en todo el nombre. Debe ejecutarse como un script de shell o AppleScript, ya que se ejecutará en launchd después de que se realice el movimiento inicial para movimientos automáticos de archivos. ¿Hay una buena manera de hacer esto? (Incluso no utilizando AppleScript). No me importa usar el shell o cualquier otro método que se sugiera.

Encontré esto publicar en StackOverflow, pero no podría darle demasiado 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 capta AppleScript.

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

Ten 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
    
pregunta bret7600 18.08.2017 - 15:35

2 respuestas

2

Supondré 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 el terminal con el siguiente comando (ejecútelo dentro de la carpeta donde se almacenan los archivos. Fallará la creación de 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
    
respondido por el user161254 19.08.2017 - 00:26
1

Como otros han respondido, es difícil saber exactamente lo que estás buscando sin los detalles. Este AppleScript debe ser un buen punto de partida y puede ajustarlo a sus necesidades. Le pedirá que identifique una carpeta que contiene los archivos que desea colocar en subcarpetas. He puesto una propiedad en la parte superior llamada removePeriods, que puede establecer como verdadera o falsa (sin comillas). Si eso es cierto, eliminará todos los puntos del nombre del archivo y usará ese nombre para crear una carpeta. Por supuesto, puedes modificar eso para que sea cualquier puntuación que desees. También podrías tener que quitarle otra puntuació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 tendrá que agregar esa ruta. Si desea quitar solo el nombre antes del primer signo de puntuación para hacer la carpeta, puede establecer un Nombre solo en el primer elemento de texto. Probablemente también desee agregar un cheque para asegurarse de que no haya una carpeta con el nombre que está creando.

EDITAR: a petición de otro usuario, estoy agregando una nota para aclarar por qué configuro 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 compile de nuevo, momento en el que se volverá a "". 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 comienzo del script 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 de acceso a la carpeta en lugar de que el usuario la seleccione. Hay muchas opciones. También debo decir de nuevo que este no es un script finalizado para 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.

    
respondido por el Hurston 22.08.2017 - 22:43

Lea otras preguntas en las etiquetas