ubuntuusers.de

Fehler im Script / Befehl

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

opiwan

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Hallo Forum,

ich wollte ein paar Zeilen Konsole für eine bestimmte Aufgabe anwenden, finde aber meinen Fehler nicht; ggf. könnt ihr helfen?

Also: Ich habe eine "Dateiliste" in Form einer Textdatei, welche Dateinamen enthält, je einer pro Zeile. Dabei gibt es leider auch Leer- und Sonderzeichen. Die Datei nennen wir mal "/home/ich/textfile.txt".

Nun würde ich gerne diese Dateien an einem bestimmten Ort, sagen wir mal /mnt suchen und auf die gefundenen Dateien ein weiteres Kommando (beispielhaft mal nur "ls -l") anwenden.

Mir ist natürlich klar, dass, wenn ich z.B. nur EINEN Dateinamen wie zum Beispiel "Datei1.jpg" suche, ich mit dem hier erfolgreich bin:

find /mnt -name "Datei1.jpg" -print0 | xargs -0 ls -l

Ich habe dann gegoogelt und als häufigstes Beispiel eine for-Anwendung gefunden. Diese hier funktioniert aber nicht:

for i in $(cat /home/ich/textfile.txt); do find /mnt -name "$i" -print0 | xargs -0 ls -hl; done

Was hier passiert: Es werden nur Dateien ohne Leerzeichen angezeigt. So scheint es zumindest, denn es werden viel zu wenige gefunden. Außerdem und für mich nicht nachvollziehbar wird der Inhalt des Ordners /home/ich ausgegeben, also der Ort wo das Input-File liegt.

Kann mir jemand sagen, welchen Fehler ich gemacht hab? Wäre echt super.

Dank Euch schon Mal

Gruß A.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21847

Wohnort: Lorchhausen im schönen Rheingau

ausnahmefehler schrieb:

Kann mir jemand sagen, welchen Fehler ich gemacht hab? Wäre echt super.

Du hast Leerzeichen in den Dateinamen. die erkennt die for-Schleife als einzelne Einträge. Die werden dann von find gesucht (was total sinnfrei ist) und entsprechend nicht gefunden. Also bitte konkret, wie sehen deine inputdaten aus und was willst Du erreichen? ▶ Richtig fragen

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Hallo,

nun ja, ich dachte es wäre klar, wenn ich beschreibe "Leerzeichen in den Dateinamen", aber hier dann doch ein Beispiel:

dsc0815.jpg
Kopie von 0815.jpg
Datei (2) Kopie.jpg

Ich hatte auch vermutet, dass er Leerzeichen sucht. Hatte es aber auch schon mit dem Zeichen " bzw. ' probiert, und zwar vor dem Dollarzeichen und nach der ersten Klammer, also

for i in "$(cat /home/ich/textfile.txt)"

bzw.

for i in '$(cat /home/ich/textfile.txt)'

Leider keine Auswirkung.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21847

Wohnort: Lorchhausen im schönen Rheingau

ausnahmefehler schrieb:

nun ja, ich dachte es wäre klar, wenn ich beschreibe "Leerzeichen in den Dateinamen", aber hier dann doch ein Beispiel:

Es ist aber nicht klar, was Du erreichen willst. Auf dem Weg wirst Du nicht weiter kommen, es gilt also Alternativen zu benennen. Das geht erst, wenn klar ist, was Du erreichen willst.

Ich hatte auch vermutet, dass er Leerzeichen sucht. Hatte es aber auch schon mit dem Zeichen " bzw. ' probiert, und zwar vor dem Dollarzeichen und nach der ersten Klammer, also

[...]

Leider keine Auswirkung.

Klar, weil du wieder Einträge erzeugst, die durch Leerzeichen getrennt werden.

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Nun gut, was ich erreichen möchte:

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! 😉

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21847

Wohnort: Lorchhausen im schönen Rheingau

Ok, das bringt uns der Sache näher.

  1. Stehen Pfade oder lediglich Dateinamen in der Quelldatei?

  2. Ist immer nur eine Datei pro Zeile gespeichert (gibt dein Ausschnitt von dreien leider nicht her - daher schon mehrfach nachgefragt)

  3. Wie entsteht die Quelldatei?

  4. find kann auch direkt löschen. Bitte so wenig Komplexität wie irgend möglich bauen.

Generell möchtest Du, wenn 2. zutrifft, also eine Textdatei zeilenweise abarbeiten, in etwa

1
2
3
4
5
file=/home/ich/textfile.txt
while read line           
do           
    ### dein Kommando hier ###           
done <$file

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Hallo,

  1. Es existieren nur die Dateinamen.

  2. Immer nur eine Datei pro Zeile.

  3. Durch ein Windows-Programm. Deshalb musste ich zuvor "dos2unix" ausführen, da z.B. nano nur Müll lieferte. Nach "dos2unix" hatte ich aber eine saubere Textdatei (hoffe ich zumindest).

  4. Ich müsste wipen, also z.B. mit "shred", einfaches Löschen reicht leider nicht aus.

Weiterhin Danke!!

Bearbeitet von redknight:

Forensyntax repariert...

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21847

Wohnort: Lorchhausen im schönen Rheingau

zu 1. und 2.: Das macht es einfacher.

zu 3.: Da würd ich gern nochmal nachhaken. Vielleicht gibt es eine sinnvolle Alternative, den input bereits unter Linux zu erzeugen und dadurch die fehlerträchtige Aktion mit den Dateinamen zu umgehen. Details bitte.

zu 4.: Welches Dateisystem wird benutzt? shred macht in modernen Dateisystemen nicht mehr das, wozu es ursprünglich geplant war. Die INformation war auch wichtig. Gibt es noch mehr, was für deine Aufgabe zu wissen ist? Lass dir bitte nicht alles einzeln aus der Nase ziehen. Es ist ermüdend, Lösungen zu erarbeiten die dann doch nicht passen.

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Noch ein anderer Gedanke.

Wenn ich das ganze über for & co mache, das hieße ja auch, dass er z.B. den Find-Befehl 10.000 mal durchführt. Das wäre ja komplett unbrauchbar, weil er 10.000 mal die komplette Platte durchsucht, oder? Von daher denke ich, mein Ursprungs-Gedanke war schon falsch.

Als Dateisystem liegt leider nur NTFS, sprich Fuse vor. Lässt sich aber nicht ändern.

Den Ursprung der Dateien kann ich nicht beeinflussen, da ich die Textfiles nicht selbst erstelle.

shred oder ggf. auch wipe sollte auf den Datenträgern (normale Festplatten) schon funktionieren...

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21847

Wohnort: Lorchhausen im schönen Rheingau

ausnahmefehler schrieb:

Noch ein anderer Gedanke.

Wenn ich das ganze über for & co mache, das hieße ja auch, dass er z.B. den Find-Befehl 10.000 mal durchführt.

Richtig. Daher die Nachfrage nach den Quelldaten.

Das wäre ja komplett unbrauchbar, weil er 10.000 mal die komplette Platte durchsucht, oder?

Gut, du kannst gewisse Unterpfade angeben, was die Suchzeit und damit die Plattenlast verkleinert. Aber generell wird 10.000 mal gesucht.

Als Dateisystem liegt leider nur NTFS, sprich Fuse vor. Lässt sich aber nicht ändern.

Darum geht es nicht. NTFS macht je nach Version und EInstellungen Shadow Copies, die shred nicht entfernt. Außerdem kommt es auf das erstellende Programm an. Beispiel Word:

  1. Datei wird geöffnet.

  2. Änderung wird gemacht.

  3. Die Änderung wird in einer versteckten, temporären Datei bereits gespeichert.

  4. Du klickst speichern.

  5. Die Ursprungsdatei wird als gelöscht markiert.

  6. Die temporäre Datei aus 3. wird sichtbar gemacht und mit dem Namen der Ursprungsdatei umbenannt.

Somit sind nach jedem Klick auf Speichern und jedem Autosave noch Reste der Datei im Dateisystem vorhanden. Wenn Shadow Copies aktiv sind, gibt es die auch noch. Gegen alles das kann shred nichts machen.

Den Ursprung der Dateien kann ich nicht beeinflussen, da ich die Textfiles nicht selbst erstelle.

Wie gesagt, mehr Details...

shred oder ggf. auch wipe sollte auf den Datenträgern (normale Festplatten) schon funktionieren...

siehe oben 😉

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Hi redknight,

Bevor ich weiterschreib noch Mals Danke bis hierher, hoffe du kannst mir ggf. sogar bis zum "Finish" helfen ☺

Also Grenzen von shred/wipe und i.V.m. den von dir genannten Restriktionen sind mir bekannt. Es geht aber wirklich nur um den stupiden Auftrag: Wipe diejenigen Dateien, die in der Liste sind. 🙄

Wie würdest du es angehen wenn nicht mit for? Hab mich schon gewundert, dass FIND keinen Parameter für ein input-file zu kennen scheint, ist aber wohl leider so. Hatte auch schon an eine Kombination mit GREP gedacht. Bin aber nicht so richtig auf einen grünen Zweig gekommen. Hast noch eine Idee?

Das mit dem Ursprung der Dateien: Ich hab jetzt mal ein Beispiel-Textfile direkt unter Linux mit NANO erstellt, um mal die Herkunfts-Problematik außen vor zu lassen.

LG A.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21847

Wohnort: Lorchhausen im schönen Rheingau

Versteh mich nicht falsch, es ist völlig OK wenn Du den Ursprung und deine Originaldaten schützt. Nur müssen wir eben wissen, welche Schritte nötig sind.

Wenn Dir die Einschränkungen bei der Benutzung von shred bekannt sind und das für dich akzeptabel ist, soll es für ich auch so sein. Ich wollte nur darauf hinweisen, dass es eben nicht das sichere Löschen ist, das es zu seiner Entwicklungszeit mal war.

Kleines Beispiel: statt

find / ....}kannst Du auch {{{find /media/deine_Platte/Verzeichnis/Unterverzeichnis ...

durchsuchen. Je weiter du den Pfad eingrenzen kannst, umso besser. Noch besser wäre es, wenn deine Quelldaten komplette Pfade enthalten würden, selbst Windows-Pfade wären OK. Dann müsste man nur einmal die Quelldatei anpassen und könnte ohne Suchvorgang loslegen.

Allerdings müsste es ja nicht zwingend find sein. Wenn sich die Daten während des Vorgangs nicht ändern, ginge es ja auch mit aufbau eines Suchindex und locate deutlich schonender.

Aber: Auch wenn es nervt: Was ist das eigentliche Ziel? Dateien runterschmeissen und weiterbenutzen oder vorbereiten für Verkauf/Entsorgung/Neuinstallation? Denn das zweite ginge deutlich schneller . Oder sollst Du gar nur was dadurch lernen? 😉

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Das Ziel ist ganz einfach vorher festgelegte Dateien zu suchen und sicher zu löschen. Nicht mehr und nicht weniger.

opiwan

(Themenstarter)

Anmeldungsdatum:
9. März 2008

Beiträge: 565

Dass er die Dateien mit den Leerzeichen nicht findet, liegt wohl an dem IFS der Bash, oder?

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21847

Wohnort: Lorchhausen im schönen Rheingau

Ich müsste nachstellen, ob es einen stabilen Weg gibt, kann ich aber hier(tm) grade nicht tun 😉

Antworten |