it-swarm.com.de

Gruppieren Sie Dateien in einigen Ordnern

Ich habe einige Dateien mit unterschiedlichen Erweiterungen wie *.pdf, *.mp3, *.jpg und einige andere. Alle von ihnen werden in einem Verzeichnis parent gespeichert.

Wie kann ich eine Liste aller Erweiterungen abrufen, einige Ordner basierend auf diesen Erweiterungen erstellen und dann alle Dateien in die entsprechenden Ordner verschieben?

12
αғsнιη

Das unten stehende Skript python erledigt den Job. Versteckte Dateien werden separat in einem Ordner sowie Dateien ohne Erweiterung gespeichert.

Da es für einen breiteren Bereich von Zwecken verwendet werden kann, habe ich einige Optionen hinzugefügt:

  • Sie können Erweiterungen festlegen, die Sie von der "Reorganisation" ausschließen möchten. Wenn Sie einfach alle verschieben möchten, setzen Sie exclude = ()
  • Sie können auswählen, was mit leeren Ordnern geschehen soll (remove_emptyfolders = True oder False)
  • Wenn Sie die Dateien kopieren anstatt verschieben möchten, ersetzen Sie die Zeile:
shutil.move(subject, new_dir+"/"+name)

durch:

shutil.copy(subject, new_dir+"/"+name) 

Das Drehbuch:

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = ".hidden_files"
        Elif not "." in name:
            extension = ".without_extension"
        else:
            extension = name[name.rfind("."):]
        if not extension in exclude:
            new_dir = reorg_dir+"/"+extension[1:]
            if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            shutil.move(subject, new_dir+"/"+name)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()

WENN die Gefahr besteht, dass doppelte Dateien ungewollt überschrieben werden

Auf Kosten einiger zusätzlicher Zeilen können wir das Überschreiben möglicher Duplikate verhindern. Mit dem folgenden Code werden Duplikate umbenannt in:

duplicate_1_filename, duplicate_2_filename 

usw.

Das Drehbuch:

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = ".hidden_files"
        Elif not "." in name:
            extension = ".without_extension"
        else:
            extension = name[name.rfind("."):]
        if not extension in exclude:
            new_dir = reorg_dir+"/"+extension[1:]
            if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            n = 1; name_orig = name
            while os.path.exists(new_dir+"/"+name):
                name = "duplicate_"+str(n)+"_"+name_orig
                n = n+1
            newfile = new_dir+"/"+name
            shutil.move(subject, newfile)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()

BEARBEITEN

In Anbetracht von OP haben wir alle vergessen, eine Gebrauchsanweisung beizufügen. Da möglicherweise doppelte Fragen ( nd do ) angezeigt werden, kann dies dennoch hilfreich sein.

Wie benutzt man

  1. Kopieren Sie eines der Skripte in eine leere Datei und speichern Sie es als reorganize.py
  2. Legen Sie im Abschnitt head des Skripts das Zielverzeichnis fest (mit den zu reorganisierenden Dateien):

    reorg_dir = "/path/to/directory_to_reorganize" 
    

    (Verwenden Sie Anführungszeichen, wenn das Verzeichnis Leerzeichen enthält.)

    mögliche Erweiterungen, die Sie ausschließen möchten (wahrscheinlich keine, wie unten):

    exclude = ()
    

    und wenn Sie danach leere Ordner entfernen möchten:

    remove_emptyfolders = True
    
  3. Führen Sie das Skript mit dem folgenden Befehl aus:

    python3 /path/to/reorganize.py
    

NB Wenn Sie die Dateien kopieren anstatt verschieben möchten, ersetzen Sie:

shutil.move(subject, new_dir+"/"+name)

durch:

shutil.copy(subject, new_dir+"/"+name)

Bitte versuchen Sie es zuerst mit einer kleinen Probe.

13
Jacob Vlijm

Sie können find mit einem etwas komplexen exec -Befehl verwenden:

find . -iname '*?.?*' -type f -exec bash -c 'EXT="${0##*.}"; mkdir -p "$PWD/${EXT}_dir"; cp --target-directory="$PWD/${EXT}_dir" "$0"' {} \;

# '*?.?*' requires at least one character before and after the '.', 
# so that files like .bashrc and blah. are avoided.
# EXT="${0##*.}" - get the extension
# mkdir -p $PWD/${EXT}_dir - make the folder, ignore if it exists

Ersetzen Sie cp durch echo für einen Trockenlauf.


Effizienter und übersichtlicher wäre es, den Befehl bash in einem Skript zu speichern (z. B. bei /path/to/the/script.sh):

#! /bin/bash

for i
do
    EXT="${i##*.}" 
    mkdir -p "$PWD/${EXT}_dir"
    mv --target-directory="$PWD/${EXT}_dir" "$i" 
done

Führen Sie dann find aus:

find . -iname '*?.?*' -type f -exec /path/to/the/script.sh {} +

Dieser Ansatz ist ziemlich flexibel. Um beispielsweise den Dateinamen anstelle der Erweiterung (filename.ext) zu verwenden, würden wir dies für EXT verwenden:

NAME="${i##*/}"
EXT="${NAME%.*}"
12
muru
ls | gawk -F. 'NF>1 {f= $NF "-DIR"; system("mkdir -p " f ";mv " $0 " " f)}'

Berechnen der Liste der Erweiterungen (nach dem Verschieben):

ls -d *-DIR

Berechnen der Liste der Erweiterungen (vor dem Verschieben):

ls -X | grep -Po '(?<=\.)(\w+)$'| uniq -c | sort -n

(In diesem letzten Beispiel berechnen wir die Anzahl der Dateien für jede Erweiterung und sortieren sie.)

6
user216043

Versuchen Sie dieses Shell-Skript.

#!/bin/sh
src=`dirname "$1"`/`basename "$1"`;
for file in "$src"/*?.?*; do
  if test -f "$file"; then
    dest="$src${file##*.}"_files;
    mkdir -p "$dest";
    mv "$file" "$dest";
  fi;
done;

# pass the directory to re-organize as first argument
# moves only regular files which have extension
# ignores other type of files including
# files having no extension, hidden files, directories, and links.
5

Wenn Sie Perls Umbenennung/Vornamen installiert haben:

rename 's!(.*)\.(\w+)$! mkdir($2); "$2/$&"!ge'  *
2
user216043