Tool für Dateiliste von nicht angeschlossenem Speicher

Deinorius

Commander
Registriert
Juni 2005
Beiträge
2.710
Servus miteinand!

Ich habe mehrere externe (eigentlich interne gebrauchte) HDDs, die meistens nicht angeschlossen sind, weil ich diese eher als Backup, teilweise Datengrab verwende. Das ist zwar weniger praktisch als ein NAS, aber günstig und für mich ausreichend.

Es wäre aber schon hilfreich, wenn es ein Programm gäbe, das die Dateiliste dieser HDDs erfassen könnte und man durch Suchen dieser Liste einfach die nötige HDD nehmen kann, wenn nötig. Quasi wie ein klassisches Archiv. Gibt es da etwas in der Richtung? Natürlich vorzugsweise für Linux, terminal kein Problem, aber ansonsten gibt es ja auch wine.
 
sudo du -ah /path/to/mountpoint >> filelist_fro_hdd1

sieht dann so aus.
4,0K ./ssl/certs/ee64a828.0
0 ./ssl/certs/8794b4e3.0
4,0K ./ssl/certs/Hellenic_Academic_and_Research_Institutions_RootCA_2015.pem
4,0K ./ssl/certs/GlobalSign_Root_CA_-_R3.pem
1,5M ./ssl/certs
4,0K ./ssl/ct_log_list.cnf
0 ./ssl/cert.pem
8,0K ./ssl/misc/tsget.pl
8,0K ./ssl/misc/CA.pl
0 ./ssl/misc/tsget
20K ./ssl/misc
4,0K ./ssl/README
1,6M ./ssl
12K ./mail.rc
20K ./tlp.conf
4,0K ./sudoers
4,0K ./keyutils
4,0K ./profile
28K ./dnsmasq.conf
4,0K ./rdnssd/resolvconf-hook
4,0K ./rdnssd/merge-hook
12K ./rdnssd
4,0K ./nftables.conf
4,0K ./lightdm/lightdm-gtk-greeter.conf
8,0K ./lightdm/lightdm.conf
4,0K ./lightdm/keys.conf
8,0K ./lightdm/lightdm.conf.pacnew
4,0K ./lightdm/users.conf
4,0K ./lightdm/Xsession
36K ./lightdm
4,0K ./security/group.conf
4,0K ./security/pwquality.conf.d
4,0K ./security/namespace.conf
4,0K ./security/namespace.init
4,0K ./security/limits.conf
4,0K ./security/pwhistory.conf
4,0K ./security/faillock.conf
4,0K ./security/pam_env.conf
4,0K ./security/time.conf
4,0K ./security/pwquality.conf
8,0K ./security/access.conf
52K ./security
4,0K ./gtk-3.0/im-multipress.conf
8,0K ./gtk-3.0
4,0K ./logrotate.conf
4,0K ./initcpio/hooks
4,0K ./initcpio/post
4,0K ./initcpio/install
16K ./initcpio
12M .
oder tree

├── ts.conf
├── udev
│ ├── hwdb.d
│ ├── rules.d
│ └── udev.conf
├── udisks2
│ ├── mount_options.conf.example
│ └── udisks2.conf
├── uniconf.conf
├── updatedb.conf
├── UPower
│ └── UPower.conf
├── usb_modeswitch.conf
├── usb_modeswitch.d
├── usb_modeswitch.setup
├── vconsole.conf
├── vdpau_wrapper.cfg
├── vimrc
├── vpnc
│ ├── default.conf
│ └── vpnc-script
├── webapps
│ └── element
│ ├── config.json -> /etc/element/config.json
│ └── config.sample.json
├── wgetrc
├── whois.conf
├── wireguard
│ ├── private.key
│ ├── public.key
│ ├── wg0.conf
│ └── wg-mjit.conf
├── wpa_supplicant
├── X11
│ ├── xinit
│ │ ├── xinitrc
│ │ ├── xinitrc.d
│ │ │ ├── 40-libcanberra-gtk-module.sh
│ │ │ ├── 50-systemd-user.sh
│ │ │ └── 80xapp-gtk3-module.sh
│ │ └── xserverrc
│ └── xorg.conf.d
│ └── 00-keyboard.conf
├── xattr.conf
 
  • Gefällt mir
Reaktionen: Iapetos und r.fx
Bei windows ging das per cmd bei linux weiß ich es grad leider nicht, nevermind madmax hat da was

Ab in den jeweiligen ordner den die Indizieren willst und dann:

dir /a:d /b /s > liste.txt
  • dir steht für das Directory
  • /a:d ohne Dateinamen
  • /b ist die vereinfachte Form ohne Datum etc.
  • /s mit allen Unterverzeichnissen
  • > (WICHTIG, nicht vergessen)
  • liste.txt ist die Ausgabedatei
 
  • Gefällt mir
Reaktionen: madmax2010
Deinorius schrieb:
Es wäre aber schon hilfreich, wenn es ein Programm gäbe, das die Dateiliste dieser HDDs erfassen könnte und man durch Suchen dieser Liste einfach die nötige HDD nehmen kann, wenn nötig. Quasi wie ein klassisches Archiv. Gibt es da etwas in der Richtung?
Schau dir das mal an https://vvvapp.sourceforge.net/index.html
Da kannst du Datenträger oder Ordner indzieren lassen und dann auch über alle suchen.
 
  • Gefällt mir
Reaktionen: omavoss
Super danke! Im Grunde ist alles dabei, was ich mir erhofft habe. xD
Eine Terminal version, mit der ich noch anderes anfangen könnte. Ein Programm für die einfache Handhabung und und dann noch plocate, mit dem ich vielleicht Dateien suchen unter KDE wirklich nutzbar machen könnte. Baloo habe ich deaktiviert.
 
Bei plocate scheint aber das Problem zu sein, dass bei einem Update immer nur die angeschlossenen Geräte indiziert und die alten, nicht vorhandenen, gelöscht werden. Das ist ein Problem bei vielen externen Laufwerken. Man will sie ja nicht immer alle gleichzeitig anschließen. Man kann zwar die Datenbank wechseln, aber eine wirkliche Lösung ist das nicht. 'plocate' ist wohl eher als Admintool, weniger als Katalog, gedacht.

Edit:
Ich probiere mal catcli, dann vvv.
Edit2:
catcli versagt bei sehr vielen Dateien, bzw. der Katalog wird mind. 15x größer als plocate.db (da habe ich abgebrochen). Dafür ist das wahrscheinlich nicht gedacht.
Entweder mache ich mir aliase für plocate oder 'ls' Dateien.
 
Zuletzt bearbeitet:
Deinorius schrieb:
Es wäre aber schon hilfreich, wenn es ein Programm gäbe, das die Dateiliste dieser HDDs erfassen könnte und man durch Suchen dieser Liste einfach die nötige HDD nehmen kann, wenn nötig. Quasi wie ein klassisches Archiv. Gibt es da etwas in der Richtung? Natürlich vorzugsweise für Linux, terminal kein Problem, aber ansonsten gibt es ja auch wine.

find /foo -ls > ~/list
grep bar ~/list
 
Wiel ich auch so manche externe Platte habe und außerdem ein NAS, das aber nur selten läuft, habe ich ebenfalls Bedarf nach so etwas. Denn Textdateien sind blitzschnell durchsuchbar. Plocate hilft hier ja gar nicht, weil man dessen Datenbank nur noch dann aktualisieren kann, wenn gerade alle Platten, die man so erfasst haben will, angeschlossen sind.

Ich habe mir ein kleines Wrapperskript um tree herum gebastelt. Man gibt ihm einen Verzeichnispfad, also normalerweise den Einhängepunkt der Festplatte. Dann entspricht der Verzeichnisname nämlich dem Partitions- bzw. Gerätenamen. Es führt tree auf diesem Verzeichnis aus und schreibt das Ergebnis in eine Textdatei, die nach dem Verzeichnis und dem aktuellen Datum bekannt ist.

Dabei werden außerdem tree-Parameter eingestellt, die ein einfaches Diffen (also Textvergleich) zweier solcher Dateien ermöglichen, dazu zählen vor allem vollständige Pfade ab dem Startverzeichnis und stattdessen keine Baumgrafik. Der große Vorteil gegenüber find ist, dass auch Berechtigungen, Dateidatum und -größe einbezogen sowie die aufsummierte Größe von Verzeichnissen ermittelt werden. Diese Informationen kann man immer mal gebrauchen. Anwendungsbeispiel: "Habe ich Film xyz? Ah ja, und wie groß ist die Datei? Alles klar, seit wann liegt die da?"

Das Skript kann ich hier gern anhängen, falls Interesse besteht, muss dafür aber nen anderen Rechner anmachen.
 
Das ultimative Tool auf diesem Gebiet heißt 'DirPrintOK'.
Es startet mit einer Art Datei-Browser-Oberfläche. Man kann die zu untersuchende Tiefe des Dateipfads variieren und somit den Umfang der Ausgabe begrenzen. Man kann auch bestimmte Dateitypen filtern (z.B. nur die Mediendateien auf den Laufwerken). Das jeweilige Resultat läßt sich als Text, PDF oder HTML speichern, sodass man es später bequem und von überall nachzulesen vermag. Einziger Haken: es ist ein reines Windows-Programm.

Ob es auch unter WINE läuft, habe ich nie ausprobiert. Das ist in meinem Fall auch nicht nötig. Erstens habe ich neben Linux auch noch Windows und zweitens sind alle meine Datengräber NTFS-formatiert, auch wenn die Dokumente, Bilder, Audios und Videos auf Ext4 unter Linux generiert worden waren.
Ohne die per DirPrintOK erzeugten Dateilisten mit den Pfadstrukturen hätte ich längst den Überblick verloren, was, wo und überhaupt ich gespeichert habe.
 
Donnerkind schrieb:
Plocate hilft hier ja gar nicht, weil man dessen Datenbank nur noch dann aktualisieren kann, wenn gerade alle Platten, die man so erfasst haben will, angeschlossen sind.
man 8 updatedb
>
-U, --database-root PATH Store only results of scanning the file system subtree rooted at PATH to the generated database. The whole file system is scanned by default.
locate(1) outputs entries as absolute path names which don't contain symbolic links, regardless of the form of PATH.

-o, --output FILE Write the database to FILE instead of using the default database.


man plocate
>
-d, --database DBPATH Find matches in the given database, instead of /var/lib/plocate/plocate.db. This argument can be given multiple times, to search multiple databases. It is also possible to give multiple databases in one argument, separated by :. (Any character, including : and \, can be escaped by prepending a \.)


Man könnte also das alles so automatisieren, so dass wenn extDriveX gemountet wird, der jeweilige Befehl updatedb -l 0 -o db_file -U source_directory ausgeführt wird. Bspw. mit udev rules.

Und dann noch ein alias für plocate -d … für das Suchen in allen Dbs.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Deinorius
Wenn das über die Suchfunktion von Dolphin funktionieren würde, wäre mir das am liebsten. Aber das werden einige Versuche.

@Donnerkind
Ich werde gern mehrere Dinge versuchen.
 
Interessant, dass man plocate auch mit anderen DBs benutzen kann. Darüber nachgedacht erscheint es aber logisch. Jedes Programm, das ich bisher schrub und Datendateien benutzt, bekommt auch die Möglichkeit, benutzerdefinierte Dateien als Alternative zu nutzen.

agon schrieb:
Man könnte also das alles so automatisieren, so dass wenn extDriveX gemountet wird, der jeweilige Befehl updatedb -U … -o … ausgeführt wird. Bspw. mit udev rules.
Beim Einhängen würde ich das nicht haben wollen:
  • den Stand habe ich schon vom letzten Mal gespeichert
  • das Laufwerk ist erstmal mit sich selbst beschäftigt. Bei großen Festplatten mit vielen Einzeldateien dauert das.
  • ich weiß vielleicht schon, was ich will und brauche nur eine bestimmte Datei. Solange wie das Auslesen läuft, kann ich die Platte nicht wieder abmelden.

Deinorius schrieb:
Wenn das über die Suchfunktion von Dolphin funktionieren würde, wäre mir das am liebsten.
Ja, die habe ich auch noch nie benutzt, im Gegensatz zur Filterfunktion (Str+I). Ich habe sie jetzt einfach mal ausprobiert (eigentlich zum ersten Mal überhaupt benutzt) und ich muss aber schon sagen, dass sie OK ist. Sie ging auch recht zügig auf meinem bescheidenen Surface Go.

Ich benutze zwar Dolphin auch sehr häufig, aber für komplexere Dinge „lebe“ ich halt im Terminal, weil alles schneller und effizienter ist. Deshalb auch das Wrapperskript um tree, da wird rein mit Textdateien gearbeitet, die dann mit grep oder in vim ausgewertet werden. Ich habe auch einen Bash-Alias ,l, der vim mit der aktuellen Version meines NAS-Inhalts öffnet.🤓 (Mein Skript legt einen Symlink auf die jeweils jüngste Datei für ein Verzeichnis an).
 
ich hätte mir auch die sha512 Prüfsummen aller Dateien mit in die Datenbank geschrieben.
 
Wenn man es braucht...
 
Ist ideal um zu Überprüfen ob eine Datei mit genau dem Inhalt schon da ist.
 
Ich habe mir jetzt diesen plocate Wrapper erstellt.

Eine Schwachstelle ist, dass (allein) die Mountpoints namensgebend für die Datenbanken sind. Wenn z.B. zwei USB-Sticks (zeitversetzt, nicht gleichzeitig eingebunden) den gleichen Ordnernamen (Mountpoint) erzeugen, teilen sie sich auch eine Datenbank (löschen sich gegenseitig). Bei Bedarf könnte man das weiter individualisieren, evtl. mit irgendwelchen H/W oder Filesystemdaten.

'database=' und 'drives=' anpassen. Pfade, die kein Mountpoint sind, werden ignoriert.

Bash:
#!/bin/bash

# updatedb wrapper to create databases for multiple sources
# version 20230727

echo -e "\n$(basename "$0") running:\n"

# Enter database file here
## (will be extended for each database)
database="/home/user/plocate-databases/plocate.db"

# Enter drives/mountpoints here
## there will be one database file created
## for each entry (if path is mounted)
## like: plocate-drive1.db
drives=(\
    /media/drive1 \
    /media/drive2 \
    /media/drive3 \
    /media/drive4 \
)

echo -e "database path: $database\n"

start1=$SECONDS
start2=$SECONDS
for i in ${drives[@]}; do
    if mountpoint -q "$i"; then
        echo -e "[\033[01;32mmounted\033[0m] $i"
    else
        echo -e "[\033[01;31munavail\033[0m] $i"
    fi
done

echo -e "\nPress <enter> to continue\n"; read -s

for i in ${drives[@]}; do
    if mountpoint -q "$i"; then
        echo -n "Processing: $i: "
        if updatedb -l 0 -U "$i" -o "${database%.*}-$(basename $i).${database##*.}"; then
            echo -e "[\033[01;32mdone\033[0m] in $(($SECONDS-$start2)) seconds"
        else
            echo -e "[\033[01;31mfailed\033[0m]"
            echo -e "\033[01;31mlast command:\033[0m updatedb -l 0 -U "$i" -o "${database%.*}-$(basename $i).${database##*.}""
        fi
    fi
    start2=$SECONDS
done

echo -e "time: $(($SECONDS-$start1)) seconds"
echo -e "\ndone!\n"

Bash:
#!/bin/bash

# plocate wrapper to parse multiple databases
# version 20230727-2

for i in /home/user/plocate-databases/plocate-*; do
    locate -d "$i" "$@"
done

plocate.png
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: agon
Uridium schrieb:
Ich habe mir jetzt diesen plocate Wrapper erstellt.
Ich war so frei und habe mir ein paar Inspirationen geholt.😇 $SECONDS kannte ich noch nicht, habe bis jetzt immer date +%s genutzt. Und ich habe eine automatische Speichermedien-Erkennung eingebaut, damit ich keine Verzeichnisse mehr von Hand angeben muss (obwohl das eigentlich ganz schnell geht, das ist ja so tief in den Fingermuskeln drin). Danke für die Idee.
 
  • Gefällt mir
Reaktionen: Uridium
Uridium schrieb:
Ich habe mir jetzt diesen plocate Wrapper erstellt.

Man könnte noch ein ionice reinbauen:

ionice - set or get process I/O scheduling class and priority
 
'ionice' ist schon recht alt und funktioniert u.U. nicht mehr erwartungsgemäß (unter async i/o, deadline scheduler, etc).

Ich würde eher zu systemd/cgroups greifen.
systemd-run --user -tqd -p IOWeight=10 -p CPUWeight=idle -p CPUSchedulingPolicy=idle myscript.sh
 
Zuletzt bearbeitet:
Zurück
Oben