xargs 后 cp 不起作用

13 xargs cp

我在 64 位主机和 32 位虚拟机上运行 debian jessie。为了节省流量,我尝试将 i386 包从主机 cp 到共享文件夹,以便在 virualbox 中使用它们。

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
Run Code Online (Sandbox Code Playgroud)

向我展示我正在寻找的包裹。但是我尝试在xargs之后对它们进行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
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚我做错了什么。这种方式甚至可能吗?

我的问题是我无法编写脚本。可能是这样的

for i in *_i386.deb ; do cp [option] full-path to shared-folder
Run Code Online (Sandbox Code Playgroud)

我没有干,因为我不会弄乱我的Host。

ara*_*aer 43

虽然您已经知道应该如何解决当前的问题,但我仍然会回答关于xargs.

xargs将它得到的字符串放在命令的末尾,而在你的情况下,你需要在cp. 使用-I选项xargs来构造命令。像这样:

ls /source/path/*pattern* | xargs -I{} cp -u {} /destination/path
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我使用{}to 作为替换字符串,所以语法看起来类似于find.

  • {} 是任意的吗?例如,我可以做 -Iblah 吗? (3认同)
  • 在没有 -u 的 mac 上 (2认同)

Sun*_*eep 14

ls -al /var/cache/apt/archives/ |
    grep 'i386' | 
    awk '{print $9}'
Run Code Online (Sandbox Code Playgroud)

可以简化为 /var/cache/apt/archives/*i386*


因此,请使用以下两者之一:

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*
Run Code Online (Sandbox Code Playgroud)

在哪里

   -t, --target-directory=DIRECTORY
          copy all SOURCE arguments into DIRECTORY
Run Code Online (Sandbox Code Playgroud)


另请参阅有关解析 ls 的信息