1. Wenn du alle Inhalte sehen, oder selber eine Frage erstellen möchtest, kannst du dir in wenigen Sekunden ein Konto erstellen. Die Registrierung ist kostenlos, als Mitglied siehst du keine Werbung!

cp- eine Datei in mehrere Ordner kopieren

Diskutiere das Thema cp- eine Datei in mehrere Ordner kopieren im Forum Mac OS - Unix & Terminal.

  1. xentric

    xentric Mitglied

    Beiträge:
    4.075
    Zustimmungen:
    844
    Mitglied seit:
    11.05.2007
    Jetzt fehlt nur noch die Haskellvariante ..
     
  2. Olivetti

    Olivetti Mitglied

    Beiträge:
    11.049
    Zustimmungen:
    3.540
    Mitglied seit:
    09.12.2005
    dann aber parallel haskell.
     
  3. Kirlia

    Kirlia Registriert

    Beiträge:
    1
    Zustimmungen:
    0
    Mitglied seit:
    10.10.2017
    Hallo, ich habe das oben genannte Beispiel (ls -1 | xargs -n 1 cp ../y/info.txt) eingegeben und es funktioniert auch!
    Ich bräuchte die Funktion so, dass aber die Dateien nur kopiert werden, wenn die Datei vorhanden ist ( ich möchte vorhandene Dateien ersetzen).
    Kann mir da jemand helfen?
    Also das Gegenteil von -n bräuchte ich wahrscheinlich^^

    Ich habe inzwischen die Antwort :)
    find . -type f -name "info.txt" -exec cp -v ../y/info.txt {} \;
     
  4. Louis64

    Louis64 Mitglied

    Beiträge:
    15
    Zustimmungen:
    1
    Mitglied seit:
    03.09.2010
    Nur der Vollständigkeit halber:

    1. Aus Verzeichnisnamen ein Array erstellen:
    Code:
    myd=(`ls -d */`)
    1.1. {Falls erwünscht Array Inhalt überprüfen:->
    Array Inhalt überprüfen:
    Code:
    echo ${myd[*]}
    }

    2. Kopieren durch Anwendung der for Schleife:
    Code:
    for i in ${myd[*]}; do cp testdatei $i; done

    Dieser Lösungsweg kann durch Schleifen und Abfragen ergänzt werden.
     
  5. Olivetti

    Olivetti Mitglied

    Beiträge:
    11.049
    Zustimmungen:
    3.540
    Mitglied seit:
    09.12.2005
    da brauchts kein array.
    Code:
    for d in */; do cp -npv ./file "$d"; done
    
    wäre völlig ausreichend, solange die verzeichnistiefe 1 nicht überschritten werden muss.

    und wenn du $i nicht quotest, stolperst du, wie weiter oben ja als problem benannt, wieder über leerzeichen.
     
  6. MiBSuM

    MiBSuM Mitglied

    Beiträge:
    10
    Zustimmungen:
    0
    Mitglied seit:
    25.04.2016
    Und noch einmal grabe ich das Thema aus.

    Was bisher gut funktioniert (falls jemand mit der Suchfunktion darauf stößt):

    - In Verzeichnis x liegen viele Verzeichnisse mit Leerzeichen in den Benennungen.
    - Im Verzeichnis y liegen "info.txt" und ein leeres Verzeichnis "ORIGINAL".

    - info.txt wird in alle Verzeichnisse in x kopiert, aber nicht in möglicherweise vorhandene Unterverzeichnisse:

    Code:
    find . -type d -mindepth 1 -maxdepth 1 -exec cp -p ../y/info.txt {} \;
    - Das Verzeichnis "ORIGINAL" wird ebenfalls in alle Verzeichnisse in x kopiert. - Wieder nur Level 1:

    Code:
    find . -type d -mindepth 1 -maxdepth 1 -exec cp -r ../y/ORIGINAL {} \;
    aber jetzt hänge ich fest:
    Jedes einzelne Verzeichnis unter x beinhaltet ein Verzeichnis "ORIGINAL" und .mp3 Dateien:

    [​IMG]
    Diese mp3s sollen in das jeweilige "ORIGINAL" verschoben werden.

    Aus Gründen, die mir verborgen bleiben, funktioniert das hier nicht:

    Code:
    find . -type d -mindepth 1 -maxdepth 1 -exec mv {}/*.mp3 {}/ORIGINAL \;

    Lege ich testweise mp3 Dateien direkt in x und gebe das hier ein (Also OHNE {}/ vor dem *.mp3):

    Code:
    find . -type d -mindepth 1 -maxdepth 1 -exec mv *.mp3 {}/ORIGINAL \;
    dann werden diese Testfiles in das Verzeichnis ORIGINAL des ersten Verzeichnisses in x verschoben. - Danach gibt es natürlich Fehler, weil nix mehr da ist zum Verschieben, aber grundsätzlich passiert genau das was passieren soll. Warum dann nicht auch MIT {}/ vor dem *.mp3?
    Als Rückmeldung kommt:
    zsh: no matches found: {}/*.mp3
     
  7. xentric

    xentric Mitglied

    Beiträge:
    4.075
    Zustimmungen:
    844
    Mitglied seit:
    11.05.2007
    Wenn die Shell keine Dateien findet, die dem gegeben Globbing Pattern entspricht (dein Term mit dem Asterisk *), lässt sie es unexpandiert. Die Befehle selbst führen keine Globbing Expansionen aus, sondern verlassen sich auf die Shell dies schon getan zu haben. Somit bekommt mv innerhalb deines exec also das Argument {}/*.mp3 geliefert und kann damit nichts anfangen.

    Du kannst also direkt mit -exec keine shell built-ins, functions, pipelines oder eben globbings nutzen, außer die wrapp'st es in etwas wie eine child shell mittels sh -c.

    Code:
     xentric@ e1231l-xentric ~/testtttt/x 1091
     $ tree
    .
    ├── Ordner 1
    │   ├── Datei 1.mp3
    │   ├── Datei 2.mp3
    │   └── ORIGINAL
    └── Ordner 2
        ├── Datei 1.mp3
        ├── Datei 2.mp3
        └── ORIGINAL
    
    4 directories, 4 files
     xentric@ e1231l-xentric ~/testtttt/x 1092
     $ find . -mindepth 1 -maxdepth 1 -type d -exec sh -c 'mv "{}"/*.mp3 "{}"/ORIGINAL/' \;
     xentric@ e1231l-xentric ~/testtttt/x 1093
     $ tree
    .
    ├── Ordner 1
    │   └── ORIGINAL
    │       ├── Datei 1.mp3
    │       └── Datei 2.mp3
    └── Ordner 2
        └── ORIGINAL
            ├── Datei 1.mp3
            └── Datei 2.mp3
    
    4 directories, 4 files
     xentric@ e1231l-xentric ~/testtttt/x 1094
    
    http://tldp.org/LDP/abs/html/globbingref.html
     
  8. MiBSuM

    MiBSuM Mitglied

    Beiträge:
    10
    Zustimmungen:
    0
    Mitglied seit:
    25.04.2016
    Wow! Das ist nichts auf das ich von selbst gekommen wäre! Von gobbing hatte ich vorher nie gehört. Das Ganze unterzuvergeben ist ziemlich clever. Vielen Dank!
     
Die Seite wird geladen...
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite weitersurfst, akzeptierst du unseren Einsatz von Cookies. Akzeptieren Weitere Informationen...