GNU/Linux >> Znalost Linux >  >> Ubuntu

Příkaz k vytvoření sekvenčně číslovaných cílených adresářů a dávkového přesunu souborů?

Vytvářím časosběrné video rozdělením videa na jednotlivé snímky, pomocí G'MIC přes příkazový řádek k průměrování každých 7 snímků a poté výstupem výsledků do nových snímků, které povedou ke snímkům pro časosběr (takto dostanu video bez šumu, které vypadá skvěle). Jak si dokážete představit, mám spoustu snímků – několik tisíc jednotlivých obrázků v adresáři, pojmenovaných sekvenčně (image1.tiff, image2.tiff atd. ). Našel jsem skript, který perfektně funguje pro přesun souborů – jednou…

k=1; find source/ -type f | while read file; do
     [[ k++ -le 7 ]] && mv "$file" target/ 
done 

Nyní potřebuji vytvořit tento skript

  1. opakuje se, dokud nejsou přesunuty všechny soubory a
  2. vytvářejte postupně číslované cílové adresáře (1, 2, 3 atd.), jak to jde, takže nakonec získám několik stovek adresářů, každý se 7 obrázky uvnitř.

Jen pro upřesnění, adresář 1 by měl obsahovat obrázky 1-7, adresář 2 by měl obsahovat obrázky 8-14 atd.

Velmi si vážím jakékoli pomoci, s touto jsem skoro uvízl.

Přijatá odpověď:

Skript (python) níže vytvoří podsložky a uspořádá vaše soubory do složek:

Navíc:

  • Skript vypočítá počet složek a přidá k názvům složek úvodní nuly pro správné řazení (protože jste zmínil tisíce souborů, což znamená stovky složek)
  • Počet souborů ve složce se může lišit v závislosti na vašem nastavení v záhlaví skriptu

Skript předpokládá:

  • Všechny soubory mají příponu, všechny soubory mají stejnou rozšíření
  • Vaše soubory se jmenují image1.tiff , image2.tiff atd. (žádné úvodní nuly).

Skript

#!/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

Jak používat

Zkopírujte skript do prázdného souboru, v sekci head nastavte adresář na vaše soubory a počet souborů na podadresář, uložte jej jako organize.py .

Spusťte jej příkazem:

python3 /path/to/organize.py

Poznámka

Pokud se chcete přesunout soubory místo kopírování nahraďte řádek:

shutil.copyfile(file, target)

od:

shutil.move(file, target)

(pozor na odsazení!)

Související:Jak nastavit barvu/vzor pozadí v okně Nautilus?
Ubuntu
  1. Najděte soubory a adresáře v Linuxu pomocí příkazu find

  2. Jak přesunu soubory a adresáře do nadřazené složky v Linuxu?

  3. Jak přesunout všechny soubory a složky pomocí příkazu mv

  1. Vytvářejte a mažte uživatele v Ubuntu 20.04

  2. Dávkové přejmenování souborů v příkazovém řádku a Xargs

  3. Přesunout řadu číslovaných souborů?

  1. Jak kopírovat soubory a adresáře v Linuxu

  2. Jak odstranit adresáře a soubory pomocí Linuxu

  3. Najít příkaz v Linuxu (Najít soubory a adresáře)