cp nachdem xargs nicht funktioniert

7

Ich starte Debian Jessie auf Host 64-Bit und in Virtualbox 32-Bit. Um Datenverkehr zu sparen, versuche ich, die i386-Pakete vom Host in den freigegebenen Ordner zu kopieren, um sie in virualbox zu verwenden.

My Hostname/var/cache/apt/archives$ ls -al /var/cache/apt/archives/ |
    grep 'i386' | 
    awk '{print $9}'
alsa-oss_1.0.28-1_i386.deb
gcc-4.9-base_4.9.2-10_i386.deb
i965-va-driver_1.4.1-2_i386.deb
libaacplus2_2.0.2-dmo2_i386.deb
libaio1_0.3.110-1_i386.deb
libasound2_1.0.28-1_i386.deb
libasound2-dev_1.0.28-1_i386.deb
libasound2-plugins_1.0.28-1+b1_i386.deb

Zeigt mir die Pakete, die ich suche. aber sie versuche ich nach xargs zu cp

My Hostname/var/cache/apt/archives$ ls -al /var/cache/apt/archives/ |
    grep 'i386' |
    awk '{print $9}' |
    LANG=C xargs cp -u /home/alex/debian-share/apt-archives/
cp: target 'zlib1g_1%3a1.2.8.dfsg-2+b1_i386.deb' is not a directory

Ich kann nicht herausfinden, was ich falsch mache. Ist das überhaupt möglich?

Mein Problem ist, dass ich kein Skript schreiben kann. Wahrscheinlich ist es so etwas

for i in *_i386.deb ; do cp [option] full-path to shared-folder

Ich habe nicht getrocknet, weil ich meinen Gastgeber nicht durcheinander bringen werde.

Jeff Schaller
quelle
1
Ich denke du wolltest cp -tstatt verwenden cp -u?
Sundeep
Nein, ich meine -u-u, --update copy only when the SOURCE file is newer than the destination file or when the destination file is missing
Außerdem kann das Ganze vereinfacht werden. Ich fühle mich wie cp -ut /home/alex/debian-share/apt-archives/ /var/cache/apt/archives/*i386*... bitte versuchen Sie dies in einigen anderen Beispielverzeichnissen
Sundeep
Das funktioniert. Ich denke manchmal zu kompliziert. ^^ Gib deinen Kommentar zu einer Antwort ab, damit ich das ausnehmen kann.

Antworten:

11
ls -al /var/cache/apt/archives/ |
    grep 'i386' | 
    awk '{print $9}'

kann vereinfacht werden /var/cache/apt/archives/*i386*


Verwenden Sie also eine der beiden folgenden Methoden:

cp -u /var/cache/apt/archives/*i386* /home/alex/debian-share/apt-archives/

cp -ut /home/alex/debian-share/apt-archives/ /var/cache/apt/archives/*i386*

wo

   -t, --target-directory=DIRECTORY
          copy all SOURCE arguments into DIRECTORY


Siehe auch Informationen zum Parsen von ls

Sundeep
quelle
26

Obwohl Sie bereits wissen, wie Sie Ihr aktuelles Problem lösen sollen, werde ich dennoch antworten xargs.

xargsSetzt die Zeichenfolge am Ende des Befehls, während Sie in Ihrem Fall diese Zeichenfolge vor dem letzten Argument von benötigen cp. Verwenden Sie die -IOption von xargs, um den Befehl zu erstellen. So was:

ls /source/path/*pattern* | xargs -I{} cp -u {} /destination/path

In diesem Beispiel verwende ich {}to als Ersatzzeichenfolge, daher sieht die Syntax ähnlich aus find.

Aragaer
quelle
3
ist das {} beliebig? könnte ich zum Beispiel -Iblah machen?
nterry
1
Ja du könntest.
Aragaer
1
auf Mac ohne -u
Jancha