ubuntuusers.de

Fehler im Script / Befehl

Status: Ungelöst | Ubuntu-Version: Ubuntu 12.10 (Quantal Quetzal)
Antworten |

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

while mit slocate wär mein Ansatz.Vorsicht, ausm Kopf und ungetestet!

#!/bin/bash
textfile=/home/du/textfile.txt
# Datenbank erstellen
slocate -U /path/to/filesystem -o /path/to/myslocatedb
# die Schleife
while read zeile
do
   echo rm -rf $(slocate -qi --database=/path/to/myslocatedb ${zeile})
done <$textfile

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Ich teste mal Verschiedenes und melde mich nachher wieder mit weiteren Hinweisen oder Ergebnissen, je nach dem... 👍

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

1
2
3
4
5
for i in $(seq 1 $(wc -l files.lst | sed 's/ .*//g'))
do
  file=$(sed -n ${i}p files.lst)
  find /mnt -name "$file" -ls
done

Statt xargs ... ls -l habe ich gleich das -ls von find benutzt. Einfaches Löschen würde ich mit -delete vornehmen, shredden mit -exec shred -n 1 {} ";".

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

@user unknknown:

Hi, du dein Script führt das auch den find befehl so oft aus wie Zeilen vorhanden sind? Ich hab nämlich das Ursprungsproblem nämlich gerade hinbekommen, und zwar so

cat filelist.txt | while read i; do find /mnt -name "$i"; done

Aber das ist def. wirklich zu langsam, weil er wie gesagt immer wieder mehrer hunder GB durchsucht.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

ausnahmefehler schrieb:

Aber das ist def. wirklich zu langsam, weil er wie gesagt immer wieder mehrer hunder GB durchsucht.

Ist das getestet zu langsam oder geraten? Die Größe des durchsuchten Plattenplatzes sollte ohne Auswirkung auf die Dauer der Suche sein.

In Performancefragen sollte man sich nie auf seine Erfahrung verlassen, sondern testen, prüfen und messen. Das lehrt die Erfahrung.

Willst Du nur einmal suchen, dann kannst Du einen regulären Ausdruck verwenden:

1
2
names=$(cat files.lst | tr  '\n' '|')
find . -regextype posix-awk -regex ".*/($names)"

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

ausnahmefehler schrieb:

Ich habe eine Dateiliste mit ca. 10.000 Dateinamen und möchte diese auf einem Datenträger mit noch wesentlich mehr Dateien finden und falls sie existieren, löschen! 😉

  1. Den Weg um die Liste einzulesen hat Dir redknight ja oben schon gezeigt: mit einer while read - Schleife.

  2. Die hässlichen Win...- Zeilenenden musst Du tatsächlich beseitigen, damit er die Namen findet. Allerdings reicht dafür eine einfache Parameter Expansion.

  3. Die find- Schleife hattest Du in Deinem Eingangspost schon angegeben.

Diese 3 Dinge müssen wir jetzt nur noch zusammenfügen und dabei sauber "quoten", dann sollte es gehen:
(dass die find- Schleife dann 10000 Mal aufgerufen wird, liegt in der Natur der Sache **)

1
2
3
while read line ; do           
        find /mnt -name "${line%$'\r'}" -print0  |  xargs -0 ls -hl
done < "/home/ich/textfile.txt"

Praktischerweise wirst Du zum löschen wahrscheinlich den -delete - Befehl von find benutzen ...
LG,

track

** Edit: Wenn das definitiv zu langsam ist, könntest Du es allenfalls anders herum machen: Du durchsuchst den Datenträger 1x, liest dabei alle Pfade in ein Array ein und filterst dann dieses Array anhand Deiner Liste. Also von der Reihenfolge her genau umgekehrt.
(allerdings bin ich mir nicht sicher, ob das wirklich was bringt, denn normalerweise cachet er die einmal gelesenen Pfade doch ...?! - es sein denn, er löscht den Cache jedes Mal beim Löschen von Dateien.)

Antworten |