GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Comando per creare directory mirate numerate in sequenza e spostare file in batch?

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

  1. ripetere finché tutti i file non vengono spostati e
  2. 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?
Ubuntu
  1. Trova file e directory su Linux con il comando find

  2. Batch ridenominazione dei file nella riga di comando e Xargs

  3. Come posso spostare file e directory nella cartella principale in Linux?

  4. Spostare un intervallo di file numerati?

  5. Come spostare tutti i file e le cartelle tramite il comando mv

Copia file e crea directory di destinazione allo stesso tempo

3 modi per trovare file e directory in Linux

Come rinominare file e directory in Ubuntu 20.04

Come visualizzare e creare file e directory nascosti in Linux

4 modi per trasferire file e directory su Linux

Comando Stat:Visualizza gli attributi di file e directory