cp sau khi xargs không hoạt động


7

Tôi chạy debian jessie trên Host 64-bit và trong hộp ảo 32-bit. Để lưu lượng truy cập, tôi cố gắng cp các gói i386 từ máy chủ đến thư mục dùng chung, để sử dụng chúng trong 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

Chỉ cho tôi các gói tôi đang tìm kiếm. nhưng họ cố gắng để cp chúng sau xargs

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

Tôi không thể tìm ra những gì tôi đang làm sai. Là cách này thậm chí có thể?

Vấn đề của tôi là tôi không thể viết kịch bản. Có lẽ nó là một cái gì đó như thế

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

Tôi không khô, vì tôi sẽ không làm hỏng Máy chủ của mình.


1
Tôi nghĩ bạn có nghĩa là để sử dụng cp -tthay vì cp -u?
Sundeep

Không, ý tôi là -u-u, --update copy only when the SOURCE file is newer than the destination file or when the destination file is missing

Ngoài ra, toàn bộ điều có thể được đơn giản hóa tôi cảm thấy .. một cái gì đó như cp -ut /home/alex/debian-share/apt-archives/ /var/cache/apt/archives/*i386*.. vui lòng thử điều này trên một số thư mục mẫu khác
Sundeep

Điều đó làm việc. Đôi khi tôi nghĩ rằng phức tạp. ^^ Hãy bình luận của bạn để trả lời, vì vậy tôi có thể ngoại trừ điều này.

Câu trả lời:


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

có thể được đơn giản hóa để /var/cache/apt/archives/*i386*


Vì vậy, sử dụng một trong hai điều sau:

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*

Ở đâu

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


Xem thêm thông tin về phân tích ls


26

Mặc dù bạn đã biết cách giải quyết vấn đề hiện tại của mình nhưng tôi vẫn trả lời xargs.

xargsđặt chuỗi nó nhận được ở cuối lệnh, trong trường hợp của bạn, bạn cần chuỗi đó trước đối số cuối cùng của cp. Sử dụng -Itùy chọn xargsđể xây dựng lệnh. Như thế này:

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

Trong ví dụ này tôi đang sử dụng {}như một chuỗi thay thế, vì vậy cú pháp trông tương tự như find.


3
là {} tùy ý? tôi có thể làm -Iblah chẳng hạn?
thiêu thân

1
Đúng bạn có thể.
aragaer

1
trên mac không có -u
jancha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.