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
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
FOLDER=$(echo $FILE | sed 's/\.[A-Za-z]*$//')
, usando la expansión de parámetros. Ver mi comentario al OP.bash
luego haga clic con el botón derecho en bash
y 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\..*$
para el patrón de búsqueda en sed
. ¡Aunque, todo esto es discutible hasta que el OP defina las necesidades reales!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.
rootFolder
es 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
.choose folder
.
usuario3439894
usuario3439894
cd
al directorio de destino y use este comando compuesto simple:for f in *.*; do mkdir "${f%.*}"; mv "$f" "${f%.*}"; done