Tìm và sao chép tập tin


128

Tại sao sau đây không sao chép các tập tin vào thư mục đích?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'

Câu trả lời:


273

Nếu mục đích của bạn là sao chép các tệp đã tìm thấy vào / home / shantanu / tosend, bạn có thứ tự các đối số để cp đảo ngược:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

Lưu ý: tìm lệnh sử dụng {} làm trình giữ chỗ cho tệp phù hợp


14
Mục đích của là \;gì?
Astrid

5
@Astrid kiểm tra cái này
shellbye

find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;Có gì sai với lệnh này? nó không hoạt động
mrid

2
Không hoạt động nếu kết quả có một khoảng trắng trong đường dẫn. Bất kỳ đề nghị cho điều này?
TheJeff

1
Trong Ubuntu 18, các dấu ngoặc nhọn cũng phải được đặt vào các dấu ngoặc đơn: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo

32

tôi đã đối mặt với một vấn đề như thế này ...

Trên thực tế, theo hai cách bạn có thể xử lý findđầu ra copylệnh trong lệnh

  1. Nếu findđầu ra của lệnh không chứa bất kỳ khoảng trắng nào, tức là nếu tên tệp không chứa khoảng trống trong đó thì bạn có thể sử dụng lệnh được đề cập bên dưới:

    Cú pháp: find <Path> <Conditions> | xargs cp -t <copy file path>

    Thí dụ: find -mtime -1 -type f | xargs cp -t inner/

  2. Nhưng hầu hết thời gian các tệp dữ liệu sản xuất của chúng tôi có thể chứa không gian trong đó. Vì vậy, hầu hết thời gian dưới đây lệnh được đề cập là an toàn hơn:

    Cú pháp: find <path> <condition> -exec cp '{}' <copy path> \;

    Thí dụ find -mtime -1 -type f -exec cp '{}' inner/ \;

Trong ví dụ thứ hai, phần cuối tức là dấu chấm phẩy cũng được coi là một phần của findlệnh, cần được thoát trước khi nhấn nút enter. Nếu không, bạn sẽ gặp lỗi như thế này

find: missing argument to `-exec'

Trong trường hợp của bạn, sao chép cú pháp lệnh sai để sao chép tệp tìm vào /home/shantanu/tosend. Lệnh sau sẽ hoạt động:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;

3. Nếu bạn có GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Ví dụ:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight

7

Bạn cần sử dụng cp -t /home/shantanu/tosendđể nói với nó rằng đối số là thư mục đích chứ không phải là nguồn. Sau đó bạn có thể thay đổi nó để -exec ... +để có được cpđể sao chép như nhiều tác phẩm càng tốt cùng một lúc.


2
Trong linux phải chỉ định thư mục đích như vậy: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM

3
Câu trả lời này có thể được cải thiện và rút ngắn nếu lệnh hoàn chỉnh được cung cấp như trong câu trả lời hàng đầu.
Brian


-2

Lý do cho lỗi đó là do bạn đang cố sao chép một thư mục yêu cầu tùy chọn -r cũng để cp Cảm ơn


3
Xin chào, vì câu hỏi đã được trả lời (từ một lúc trước) đây không thực sự là một câu trả lời có liên quan, nó cũng nên là một nhận xét (khi bạn có thêm một số đại diện), trừ khi bạn muốn mở rộng và giải thích nó. Chỉ cần một cái đầu lên :).
W1ll1amvl
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.