Anzeige:
Ergebnis 1 bis 11 von 11

Thema: find -printf mit Anführungszeichen

  1. #1
    Registrierter Benutzer
    Registriert seit
    Oct 2014
    Beiträge
    54

    find -printf mit Anführungszeichen

    Hallo Forumnutzer,


    ich habe folgende Ordnerstruktur:
    Code:
    ++Hauptordner
    
    + Unterordner
    - Datei1.txt
    - Datei2.txt
    - Datei3 mit Leerzeichen.txt
    Aktuell befinde ich mich im Verzeichnis Hautpordner. Es geht mir eigentlich mehr um den Befehl find.
    Code:
    tar -vc -C Unterordner/ $(find Unterordner/ -name 'Datei*' -printf '%P ') -f Test.tar
    Das funktioniert zwar mit Datei1.txt und Datei2.txt, jedoch nicht die, mit den Leerzeichen.
    Dann dachte ich mir, dass find einfach die Ausführungszeichen selber hinzufügen soll:
    Code:
    tar -vc -C Unterordner/ $(find Unterordner/ -name 'Datei*' -printf '"%P" ') -f Test.tar
    dann meckert er allerdings und tar interpretiert hier die Ergebnisse scheinbar als Befehle (Funktion stat fehlgeschlagen: Datei oder Verzeichnis nicht gefunden erscheint bei jeder einzelnen Datei)

    Gibt es eine Möglichkeit, dass find automatisch Anführungzeichen hinzufügt, um auch Dateien mit Leerzeichen möglich zu machen?

    Ich bedanke mich im Voraus!


    Mit freundlichen Grüßen
    PHBU



    P.S.: Die Funktion ist übrigens dafür gedacht, dass man aus unterschiedlichen Verzeichnissen Dateien zu einem tar-Archiv packen kann, ohne zwischenzuspeichern (z.B. über ncat per pipe mehrere Dateien/Verzeichnisse schicken, ohne ein temporär erstelltes tar nutzen zu müssen (mit -f -)).

  2. #2
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Das was die Subshell liefert wird mittels IFS aufgespaltet. Und IFS enthält Leerzeichen. D. h. Dateien mit Leerzeichen werden in einzelne nicht existente Teile zerlegt. -T liest anscheinend Dateinamen zeilenweise. Sicherheitshalber schau aber nochmal in die manpage von tar.

    Code:
    find Unterordner | tar -T - -tvf test.tar
    Geändert von fork (26.07.16 um 10:18 Uhr)

  3. #3
    Registrierter Benutzer Avatar von drcux
    Registriert seit
    Oct 2003
    Beiträge
    6.989
    find Ordner -iname "*wasauchimmer*" -print0 | tar -cvf test.tar.gz -T -

  4. #4
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    find und tar beherrschen beide "zero-termination".
    D.h. sie können Dateinamen, die durch die binäre Null voneinander getrennt sind, verarbeiten.
    Damit umgehst du dieses Problem einfach und elegant.

  5. #5
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Also...
    Code:
    find Ordner -iname "*wasauchimmer*" -print0 | tar -cvf test.tar.gz -T - --null

  6. #6
    Registrierter Benutzer
    Registriert seit
    Oct 2014
    Beiträge
    54

    Fast richtig...

    Hallo nochmal,


    ja, ich weiß schon, was Ihr meint. Das geht bei nur einem Verzeichnis natürlich ohne Probleme.
    Was aber bei mir vorkommen würde, wäre folgender Befehl:
    Code:
    tar -vc -C Unterordner/ $(find Unterordner/ -name 'Datei*' -printf '%P ') -C naechster_Unterordner/ $(find naechster_Unterordner/ -name 'Datei*' -printf '%P ') -f Test.tar
    Und da wird nur eine Pipe (T -) halt schwierig.

    Trotzdem danke nochmal für die Antworten.

    Würde mich auf weitere freuen!


    Mit freundlichen Grüßen
    PHBU

  7. #7
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Verstehe nicht warum das schwierig werden sollte. Alles was Du an Dateien mit find finden kannst, kannst Du auch mit tar -T - sichern.

  8. #8
    Registrierter Benutzer
    Registriert seit
    Oct 2014
    Beiträge
    54

    präziser erklärt

    Hallo nochmal,


    Verstehe nicht warum das schwierig werden sollte. Alles was Du an Dateien mit find finden kannst, kannst Du auch mit tar -T - sichern.
    Hier nochmal mein "Wunschbefehl":
    Code:
    tar -vc -C Unterordner/ $(find Unterordner/ -name 'Datei*' -printf '%P ') -C naechster_Unterordner/ $(find naechster_Unterordner/ -name 'Datei*' -printf '%P ') -f Test.tar
    Ich sage zu tar: "Wechsle in das Unterverzeichnis Unterordner/ und füge alle Dateien mit dem Namen Dateien* hinzu. Anschließend wechselst du in das Verzeichnis naechster_Unterordner/ und fügst alle Dateien mit dem Namen Dateien* hinzu.

    Und da liegt das Problem. -T - würde jetzt die Standardeingabe lesen mit dem bspw. Verzeichnis Unterordner/. naechster_Unterordner/ könnte ich mit einem weiteren find allerdings nicht über STDIN leiten, da ich ja diese schon für das Verzeichnis Unterordner/ benötige.
    Deswegen dachte ich, nutze ich einfach Subshells. Der obige Befehl funktioniert zwar mit Dateien, die keine Leerzeichen enthalten - doch das soll er ja auch unterstützen.

    Im Endeffekt möchte ich ja nur fogendes realisieren:
    Code:
    tar -c -C Unterordner/ *.mp4 -C weiterer_Unterordner/ * -C noch_ein_Unterordner/ Lied.mp3 -f - | Test.tar
    tar soll im Unterordner Unterordner/ alle mp4-Dateien, im Unterordner noch_ein_Unterordner/ alle Dateien und Unterverzeichnisse sowie im Unterordner noch_ein_Unterordner/ die Datei Lied.mp3 hinzufügen.
    Das funktioniert so aber nicht. Und dafür brauche ich jetzt eine Lösung.

    Ich muss übrigens nicht zwangsweise tar nehmen. Ein Kommandozeilenprogramm wäre halt schön.

    Danke im Voraus!


    Mit freundlichen Grüßen
    PHBU

  9. #9
    Registrierter Benutzer
    Registriert seit
    Oct 2014
    Beiträge
    54

    7z - aber doch nicht perfekt

    Hallo nochmal,


    also 7z entspricht bei der Vorhergehensweise des Archivierens zwar meinen Vorstellung, allerdings kann dieses scheinbar nicht auf das Terminal schreiben.

    Code:
    7z a - /media/USB-Stick/Ordner > Test.7z
    Funktioniert leider nicht. Oder gibt es doch eine Möglichkeit, dass 7z auf stdout schreibt. /dev/stdout funktioniert leider auch nicht.


    Mit freundlichen Grüßen
    PHBU

  10. #10
    Registrierter Benutzer Avatar von drcux
    Registriert seit
    Oct 2003
    Beiträge
    6.989
    Dann setzte doch IFS auf Newline, dann geht das auch so:

    Code:
    IFS=$'\n'
    tar -cv $(find testdir1 -iname "*.txt1") $(find testdir2 -iname "*.txt2") -f test.tar.gz

  11. #11
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    find irgendwo -iname '*.mp3' -o -iname '*.mp4

    Finde irgendwo alle Dateien deren Namen auf .mp3 enden ODER deren Namen auf .mp4 enden.

    Wenn du find nicht mit -mindepth -maxdepth begrenzt, werden so oder so alle Unterverzeichnisse mit durchsucht.

Ähnliche Themen

  1. find -printf für BusyBox
    Von BlackPanther im Forum Linux als Server
    Antworten: 30
    Letzter Beitrag: 14.01.16, 05:48
  2. Anführungszeichen in der Unix-Welt
    Von Joy im Forum Linux Allgemein
    Antworten: 13
    Letzter Beitrag: 17.01.04, 17:01
  3. Nicht korrespondierende einfache Anführungszeichen
    Von ThorstenHirsch im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 03.05.03, 23:01
  4. Doofe Frage zu printf() ...
    Von mrsuicide im Forum Linux Allgemein
    Antworten: 41
    Letzter Beitrag: 11.01.03, 19:45
  5. printf() und Rundungen
    Von Algol im Forum Anwendungen Allgemein, Software
    Antworten: 5
    Letzter Beitrag: 12.09.02, 17:04

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •