Sao chép nhiều tập tin từ tên tệp X sang tên tệp Y?


7

Những gì tôi muốn làm là sao chép các tập tin trong phạm vi từ điển.

Ví dụ về các tập tin:

-rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
-rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
-rw-r--r--   4 root root    4096 Feb  2  2007 acpi.txt
-rw-r--r--   1 root root      48 Feb  8  2008 adjtime.jpg
-rw-r--r--   4 root root    4096 Feb  2  2007 alchemist.jpg

Ví dụ sử dụng:

  • Sao chép 3 file từ asps.cfgđếnacpi.txt
  • Sao chép 3 file từ a2ps-site.cfgđếnadjtime.jpg
  • Sao chép 4 file từ a2ps-site.cfgđếnalchemist.jpg

Vậy có cách nào để sao chép một loạt các tệp (từ tên tệp X sang tên tệp Y) vào một thư mục không?

Giống: cp filenameX ... filenameY destination/


Ở đây muộn rồi ... nhưng không rõ bằng cách nào hoặc tại sao bạn lại sao chép các tệp 'cfg' sang 'jpg' và tại sao bạn nói có 'phạm vi'. Ngoài ra chúng dường như được sở hữu bởi root. Bạn sẽ làm điều này sao chép như root?

Tôi đoán anh ta có nghĩa là sao chép tất cả các tệp từ asps.cfg sang acpi.txt vào một thư mục đích hoặc ít nhất đó là cách tôi diễn giải nó.

Các tập tin chỉ là ví dụ, tôi sẽ sao chép nhiều hình ảnh.

1
Tôi nghĩ sẽ hữu ích hơn nếu ví dụ của bạn là trường hợp sử dụng thực tế của bạn. Vì nó đứng, rất khó để xác định những gì bạn cần làm.
Steven D

Trường hợp sử dụng thực tế của tôi là khoảng 200 hình ảnh vì vậy sẽ kéo dài .. Tôi đã sử dụng 5 trường hợp tệp đó là đủ để hiển thị những gì Im sau. Những gì tôi cần làm là các ví dụ sử dụng trong câu hỏi. Nếu bạn không hiểu câu hỏi, bạn không thể trả lời được;)
Tiax

Câu trả lời:


4

Một cách tiếp cận chung là xác định hàm shell in một loạt tên tệp. Một phiên bản đơn giản của chức năng này sẽ liệt kê tất cả các tệp giữa hai tên tệp được bao gồm trong thư mục hiện tại:

range()
{
    ls | sed -n "/^$1\$/,/^$2\$/p"
}

Điều này sử dụng một phạm vi sed nói để in ra bất cứ điều gì giữa hai chuỗi đã cho ( $1$2).

Sau đó, bạn có thể sử dụng chức năng này trong cp(1)lệnh của mình :

cp $(range asps.cfg acpi.txt) /destination/path

Điều này sẽ thất bại nếu bạn có tên tệp có khoảng trắng trong đó. Đối với điều đó, bạn cần phải phức tạp hơn một chút:

range asps.cfg acpi.txt | xargs -d '\n' -I {} cp {} /destination/path

Điều đó sẽ thất bại nếu tên tệp của bạn có dòng mới (\ n) trong đó. Điều đó là rất khó xảy ra, vì vậy sửa chữa đó là một bài tập cho người đọc.

Bạn có thể cuộn nó lại với nhau thành một hàm shell khác:

cprange()
{
    [ $# -eq 3 ] || { echo "usage: cprange start end dir" >&2; return 1;}
    range "$1" "$2" | xargs -d '\n' -I {} cp {} "$3"
}

và sử dụng nó như:

cprange filenameX filenameY destination

Hãy nhớ rằng, phạm vi chỉ hoạt động cho tên tệp trong thư mục hiện tại. Bạn có thể mở rộng theo cách đó theo một số cách (tham số thư mục bổ sung để range, trích xuất một đường dẫn từ đối số sang rangesử dụng dirname, v.v.) nhưng tôi sẽ để bạn tùy theo yêu cầu của bạn. Xin hỏi nếu bạn muốn biết thêm chi tiết ở đây.


Làm cách nào để xác định phạm vi hàm ()? Tôi đã cố gắng tạo ra một tập tin có tên range.sh với funtion trong đó sau đó chạy ./range.sh nhưng sau đó khi tôi cố gắng sử dụng nó, nó nói "-sh: khoảng: command not found"
Tiax

Bạn cần nguồn tệp chứ không phải chạy nó để chức năng nằm trong môi trường bash hiện tại của bạn. Giống như:source range.sh
Steven D

Nếu đó là một chức năng mà bạn có thể sử dụng nhiều, hãy đặt nó vào .bashrc của bạn. Nếu không, bạn chỉ có thể tạo một tập lệnh shell trên đường dẫn của bạn và bỏ qua gói chức năng.
camh

3

Zsh có một cách dễ dàng để chọn một loạt các tệp trong kết quả của một quả địa cầu (một quả cầu là một ký tự đại diện). Về mặt tích cực, lệnh rất ngắn để viết. Trên trang web trừ, bạn sẽ phải tìm ra thứ tự của các tệp bạn muốn viết. Ví dụ: lệnh sau sao chép tệp thứ 21, 22, Mạnh, 40 với .jpgphần mở rộng trong thư mục hiện tại, với các tệp được liệt kê theo thứ tự bảng chữ cái:

cp *.jpg([21,40]) destination/

Zsh có một tùy chọn có thể có hoặc không hữu ích với bạn: dưới setopt numeric_glob_sort, foo9bar.jpgsẽ được sắp xếp trước foo10bar.jpg. Bạn cũng có thể chọn một thứ tự sắp xếp khác nhau trong vòng loại toàn cầu, ví dụ: cp *.jpg(om[21,40]) destination/để chọn các tệp gần đây thứ 21 đến 40 (sử dụng vốn Ođể sắp xếp theo thứ tự ngược lại). Xem vòng loại toàn cầu trong hướng dẫn để biết thêm thông tin.

Trong bất kỳ shell nào, bạn có thể viết một vòng lặp lặp qua các tệp, bắt đầu sao chép ở tệp đầu tiên bạn muốn viết và dừng sau tệp cuối cùng. Cảnh báo, chưa được kiểm tra.

in_range=
for x in *.jpg; do
  if [ "$x" = "first-file.jpg" ]; then in_range=1; fi
  if [ -n "$in_range" ]; then cp "$x" destination/; fi
  if [ "$x" = "last-file.jpg" ]; then break; fi
done

0

Đơn giản nhất trong ví dụ này là sử dụng M- * để hoàn thành mẫu của bạn và xóa những mẫu bạn không muốn sao chép.

% cp *[hit Escape and press *]
->
% cp file1 file2 file3 file4 ... 

và sau đó chỉ cần xóa thủ công các tệp bạn không muốn sao chép. Dù sao, đây là một tính năng vỏ, không phải cp.

Bạn có thể tinh chỉnh các mẫu như bạn muốn. Nếu bạn có nhiều tệp khác trong thư mục và bạn chỉ muốn sao chép những tệp bắt đầu bằng a, bạn chỉ cần bắt đầu mẫu với chữ cái đó. Bạn có thể muốn tra cứu tài liệu của shell về tên tập tin toàn cầu. Ví dụ: http://tldp.org/LDP/abs/html/globbingref.html .


Vì nó sẽ có rất nhiều hình ảnh phức tạp như vậy ..

0

Có vẻ như tên tệp được sắp xếp và bạn dường như phân phối với số lượng tương tự.

Nhận tất cả tên tệp vào một tệp

ls > all_files

Chia tập tin thành từng đợt

split -l 4 all_files all_files-

Bây giờ bạn có 4 tên tệp trong mỗi tệp, all_files-*

Chọn một, nói all_files-aavà làm bản sao của bạn:

xargs -I{} cp {} folder_for_batch_1 < all_files-aa


Nếu đối tượng chỉ để bó chúng, có một cách dễ dàng hơn! ls | xargs -iX -n20 cp X target_folder/sẽ chạy cp trên các tệp theo lô 20 cho đến khi hoàn tất.
Caleb

Sự khác biệt là, phiên bản, thư mục đích của bạn giống nhau cho tất cả các lô.
Có thể Burak Çilingir
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.