Điểm:0

Chỉ sao chép các tệp từ danh sách vào thư mục mới từ cấu trúc thư mục lớn

lá cờ in

Tôi có một bộ sưu tập ảnh hoa khổng lồ vì tôi đang chuẩn bị một cuốn sách. Tôi sẽ chỉ sử dụng một số trong số chúng có trong một tệp có tên là selectn.txt (thực ra là một tệp csv). Tôi phải chọn những cái đã chọn từ cây thư mục được tổ chức theo cách này:

Những bức ảnh
âââ Hoa 2020
â âââ 1.- Xuân 2020
â âââ 2.- Hè 2020
â âââ 3.- Thu 2020
â âââ 4.- Mùa đông 2020
âââ Hoa 2021
    âââ 1.- Xuân 2021
    âââ 2.- Mùa hè 2021
    âââ 3.- Mùa thu 2021
    âââ 4.- Mùa đông 2021

10 thư mục, 5260 tập tin

và sao chép từng bức ảnh hoa đã chọn vào một thư mục mới có tên là Chosen-ones (ví dụ). Hy vọng tôi đã giải thích đúng những gì tôi cần phải làm.

Dưới đây là một số dòng của tệp csv đã chọn.txt

DSC10233.jpg
DSC10276.jpg
DSC10288.jpg
DSC10399.jpg
DSC10448.jpg
DSC10489.jpg
DSC10492.jpg

Có thể sử dụng Bash hoặc có thể là tập lệnh Python không?

Cảm ơn trước.

lá cờ br
@Vidal có vẻ như các nhận xét trên được bạn trả lời, điều cuối cùng duy nhất là tên tệp trong `chosen.txt` có phải là duy nhất không?
user535733 avatar
lá cờ cn
Chắc chắn là có thể... nhưng việc hướng dẫn bạn cách viết kịch bản có thể mất nhiều thời gian hơn là chỉ thực hiện công việc sau này trong quy trình làm việc của bạn. Ví dụ: bạn có thể sẽ cần xem lại từng hình ảnh theo cách thủ công trong quá trình bố cục của mỗi trang và đó có thể là thời điểm tốt hơn để sao chép ảnh vào một tệp riêng (hoặc trực tiếp vào bản thảo).
Điểm:3
lá cờ kr

Chắc chắn, bạn có thể làm điều này với một tập lệnh Bash rất nhỏ.

Tôi giả định rằng bạn có danh sách đã chọn.txt trong thư mục chính của bạn, trong đó Ảnh là thư mục con. Nếu đây không phải là trường hợp, vui lòng điều chỉnh các đường dẫn cho phù hợp.

Đầu tiên tạo thư mục để di chuyển các tập tin vào. Tôi cho rằng bạn vừa mở một thiết bị đầu cuối và bạn đang ở trong thư mục chính của mình. Bạn có thể di chuyển thư mục sau.

mkdir ChosenOnes

Bây giờ hãy kiểm tra xem bạn có thể tìm đúng tệp bằng danh sách của mình như thế này không:

trong khi đọc -r dòng; tìm Ảnh -name "$line" -ls; hoàn thành < đã chọn.txt

Nếu kết quả có vẻ chính xác, bạn có thể sao chép các tệp bằng cách điều chỉnh lệnh:

trong khi đọc -r dòng; tìm Ảnh -name "$line" -exec cp -vt ChosenOnes {} \; ; hoàn thành < đã chọn.txt

Chúng ta có thể làm cho nó trông đẹp hơn một chút:

#!/bin/bash
# đọc danh sách của chúng tôi và
trong khi đọc -r dòng; làm
  # tìm các tệp trong đó và sao chép chúng vào thư mục mới
  tìm Ảnh -name "$line" -exec cp -vt ChosenOnes {} \;
hoàn thành < đã chọn.txt

Giải trình

  • trong khi đọc -r dòng; Làm vài thứ; hoàn thành < tệp đầu vào Một trong khi vòng lặp tiếp tục làm điều gì đó miễn là điều kiện vẫn còn. Ở đây chúng tôi đang yêu cầu danh sách của chúng tôi được đọc từng dòng một. Mỗi dòng sẽ được đưa vào biến dòng để chúng ta có thể chạy một số lệnh trên đó. Khi chúng tôi hoàn thành (các) lệnh của mình trên dòng đó, dòng tiếp theo sẽ được đọc cho đến khi chúng tôi hết dòng trong tệp của mình.
  • tìm tên đường dẫn "$line" Các tìm thấy lệnh thực hiện tìm kiếm đệ quy từ đường dẫn đã cho (Hình ảnh trong trường hợp của chúng tôi). Ở đây chúng tôi sử dụng -Tên tùy chọn để tìm các tệp khớp với tên trong danh sách.
  • -ls Các tìm thấy lệnh có một tùy chọn để liệt kê các tệp được tìm thấy. Điều này hữu ích để kiểm tra những gì được tìm thấy trước khi thực hiện bất kỳ hành động nào
  • lệnh -exec {} \; Các -exec tùy chọn để tìm chạy lệnh đã cho trên các tệp đã được tìm thấy (được biểu thị bằng {})
  • cp -vt Các -v tùy chọn làm cho cp cho chúng tôi biết nó đang làm gì. Các -t tùy chọn chỉ định đích (chúng tôi cung cấp thư mục đích ngay sau nó); nếu không, đích sẽ được coi là đối số cuối cùng.
Điểm:2
lá cờ ar

Có, có một số cách để làm điều này trên dòng lệnh.

Giả sử rằng bạn chỉ có một danh sách tên tệp (không có đường dẫn), bạn có thể sử dụng một trong khi vòng lặp để đọc tệp "chosen.txt" của bạn, tìm thấy để tìm các tệp trong thư mục nguồn của bạn và một thư mục khác trong khi vòng lặp để sao chép chúng.

Việc xác định các biến cho phép bạn sử dụng lại lệnh dài mà không phải chỉnh sửa nó.

list="/path/to/chosen.txt"
nguồn="/đường dẫn/đến/Ảnh"
đích = "/đường dẫn/đến/đích"
con mèo "đã chọn.txt" \
| trong khi đọc n; làm 
      tìm "$source" -name "$n" \
      | trong khi đọc f; làm
            cp "$f" "$dest/"
        xong
  xong

Hoặc trên một dòng duy nhất:

con mèo "đã chọn.txt" | trong khi đọc n; tìm "$source" -name "$n" | trong khi đọc f; làm cp "$f" "$dest/"; xong; xong

Một cách khác, nếu tệp .csv gốc của bạn cũng chứa đường dẫn đến tệp, thì bạn có thể tạo một danh sách từ đó. Sau đó, bạn có thể sử dụng rsync với --files-từ= tùy chọn sao chép chúng bằng cách duy trì cấu trúc thư mục gốc của nguồn.

Zanna avatar
lá cờ kr
Ồ, tôi thích ý tưởng `rsync`. Kịch bản của bạn hoạt động tốt cho tôi.
Vidal avatar
lá cờ in
Tôi cũng thích ý tưởng rsync, nhưng tiếc là trong trường hợp này, danh sách không bao gồm đường dẫn của các tệp mong muốn.
lá cờ ar
@Vidal: nếu danh sách không bao gồm đường dẫn, thì đầu ra của lệnh tìm sẽ có.Vì vậy, điều đó có thể được sử dụng để tạo một danh sách mới hoặc được chuyển trực tiếp vào rsync.
Vidal avatar
lá cờ in
Cảm ơn. Tôi đã đánh dấu câu hỏi là đã giải quyết bằng vòng lặp while. Tuy nhiên, tôi cũng sẽ thử nó với rsync vì tôi rất thích lệnh đó.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.