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
Moderator & Supporter
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
Moderator & Supporter
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
Moderator & Supporter
Anmeldungsdatum: 30. Oktober 2008
Beiträge: 21847
Wohnort: Lorchhausen im schönen Rheingau
|
Ok, das bringt uns der Sache näher.
Stehen Pfade oder lediglich Dateinamen in der Quelldatei? Ist immer nur eine Datei pro Zeile gespeichert (gibt dein Ausschnitt von dreien leider nicht her - daher schon mehrfach nachgefragt) Wie entsteht die Quelldatei? 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 | 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,
Es existieren nur die Dateinamen. Immer nur eine Datei pro Zeile. 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). Ich müsste wipen, also z.B. mit "shred", einfaches Löschen reicht leider nicht aus.
Weiterhin Danke!!
|
redknight
Moderator & Supporter
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
Moderator & Supporter
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:
Datei wird geöffnet. Änderung wird gemacht. Die Änderung wird in einer versteckten, temporären Datei bereits gespeichert. Du klickst speichern. Die Ursprungsdatei wird als gelöscht markiert. 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
Moderator & Supporter
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
Moderator & Supporter
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 😉
|