Sto creando un video timelapse dividendo un video in singole immagini, usando G'MIC tramite la riga di comando per fare una media ogni 7 fotogrammi, quindi emettere i risultati su nuove immagini che risulteranno nei fotogrammi per il timelapse (in questo modo ottengo video senza rumore che sembra fantastico). Come puoi immaginare ho molti frame:diverse migliaia di singole immagini in una directory, nominate in sequenza (image1.tiff, image2.tiff, ecc. ). Ho trovato uno script che funziona perfettamente per spostare i file, una volta...
k=1; find source/ -type f | while read file; do
[[ k++ -le 7 ]] && mv "$file" target/
done
Quello di cui ho bisogno ora è creare questo script
- ripetere finché tutti i file non vengono spostati e
- creo directory di destinazione numerate in sequenza (1, 2, 3, ecc.) man mano che procedo, così mi ritrovo con diverse centinaia di directory ciascuna con 7 immagini all'interno.
Giusto per chiarire, la directory 1 dovrebbe contenere le immagini 1-7, la directory 2 dovrebbe contenere le immagini 8-14, ecc.
Qualsiasi aiuto è molto apprezzato, sono praticamente bloccato con questo.
Risposta accettata:
Lo script (python) di seguito crea sottocartelle e organizza i tuoi file nelle cartelle:
Inoltre:
- Lo script calcola il numero di cartelle e aggiunge zeri iniziali ai nomi delle cartelle per un ordinamento corretto (dato che hai menzionato migliaia di file, ovvero centinaia di cartelle)
- Il numero di file per cartella può variare, a seconda dell'impostazione nell'intestazione dello script
Lo script presuppone:
- Tutti i file hanno un'estensione, tutti i file hanno la stessa estensione
- I tuoi file sono denominati
image1.tiff
,image2.tiff
ecc (senza zeri iniziali).
Il copione
#!/usr/bin/env python3
import os
import math
import shutil
#---
directory = "/path/to/files" # path to your files
n_perfolder = 7 # number of files per sub folder
#--
# creating file list, extension
f_list = os.listdir(directory); ext = f_list[0].split(".")[-1]
# calculate number of folders
n_folders = math.ceil(len(f_list)/n_perfolder)
# creating folder names, including leading zeros
folders = [str(fn+1) for fn in range(n_folders)]
fl_names = [(len(max(folders, key=len))-len(fl))*"0"+fl for fl in folders]
# creating folders and allocate files
for i in range(len(fl_names)):
mkfolder = directory+"/"+fl_names[i]
if not os.path.exists(mkfolder):
os.makedirs(mkfolder)
r = range(i*n_perfolder+1, i*n_perfolder+n_perfolder+1)
for n in r:
try:
file = directory+"/"+"image"+str(n)+"."+ext
target = mkfolder+"/"+"image"+str(n)+"."+ext
shutil.copyfile(file, target)
except FileNotFoundError:
pass
Come si usa
Copia lo script in un file vuoto, nella sezione head, imposta la directory sui tuoi file e il numero di file per sottodirectory, salvalo come organize.py
.
Eseguilo con il comando:
python3 /path/to/organize.py
Nota
Se desideri spostarti i file invece di copiare, sostituisci la riga:
shutil.copyfile(file, target)
di:
shutil.move(file, target)
(attenzione al rientro!)
Correlati:come impostare il colore/motivo di sfondo in una finestra di Nautilus?