Điểm:2

Tìm tất cả các tệp có phần mở rộng đã cho trong các thư mục con và thêm chuỗi con tương ứng với thư mục con

lá cờ cn

tôi có rất nhiều txt tập tin, nằm rải rác trên các thư mục khác nhau.

- trường hợp 1
   |
    - 0,25
       |
        - case1.txt
    - 0,35
       |
        _ case1.txt
    - 0,30
       |
        _ case1.txt
    - 0,45
       |
        _ case1.txt

- trường hợp2
   |
    - 0,25
       |
        - trường hợp2.txt
    - 0,35
       |
        _ case2.txt
    - 0,30
       |
        _ case2.txt
    - 0,45
       |
        _ case2.txt

.
.
.

Tôi muốn sao chép tất cả chúng vào một thư mục, nhưng thật không may, như bạn có thể thấy, một số trong số chúng có cùng tên, và do đó, tìm thấy giải pháp cuối cùng ghi đè lên chúng. Tôi muốn sao chép tất cả các txt tập tin vào một thư mục foo, chèn tên của thư mục con chứa chúng, trước .txt sự mở rộng. Ngoài ra, vì thư mục con đó có một dấu chấm trong tên và tôi cần sao chép các tệp này vào Windows, tôi cũng muốn thay đổi 0.25 đến 0_25. Nói cách khác, tệp

- trường hợp2
   |
    - 0,25
       |
        - trường hợp2.txt

phải được sao chép vào foo như case2_0_25.txt. Nếu một giải pháp bash quá phức tạp/không thể đọc được, thì một giải pháp Python cũng sẽ ổn, nhưng không phải một zsh một.

Điểm:3
lá cờ cn

Bạn chia bản sao thành hai phép biến đổi trong đó bước đầu tiên dịch các dấu chấm và dấu gạch chéo thành dấu gạch dưới và bước tiếp theo sẽ sắp xếp lại các biểu thức con phù hợp theo thứ tự mong muốn.

shopt -s sao cầu; \
tar -cvf - --show-transformed-names --transform='s![.]!_!g' --transform='s!.*/\([^/]\+\)/\([ ^/]\+\)_txt$!foo/\2_\1.txt!' trường hợp*/**/*.txt | tar -xf -

Bây giờ, nó rất quan trọng --biến đổi trùng khớp, nếu không các tệp đó sẽ không được xử lý.

Một giải pháp Bash sẽ hoạt động theo cùng một cách.

#!/bin/bash

shopt -s nullglob globstar

mkdir -p foo
trong khi đọc -rd ''; làm
    [[ ${REPLY//./_} =~ ([^/]+)/([^/]+)_txt$ ]] && 
        cp -va "$REPLY" "foo/${BASH_REMATCH[2]}_${BASH_REMATCH[1]}.txt"
xong < <(printf %s\0 case*/**/*.txt)
Điểm:2
lá cờ cn

Bạn có thể làm điều này đủ dễ dàng bằng cách sử dụng tùy chọn globstar của bash (từ người đàn ông bash):

ngôi sao địa cầu

Nếu được đặt, mẫu ** được sử dụng trong ngữ cảnh mở rộng tên đường dẫn sẽ khớp với tất cả các tệp và không hoặc nhiều thư mục và thư mục con. Nếu mô hình được theo sau bởi một /, chỉ các thư mục và thư mục con khớp với nhau.

Vì chúng ta có thể sử dụng ** để tìm các tệp, chúng ta chỉ cần xác định tên mới bao gồm tên thư mục gốc và thay đổi . đến _:

cho tệp trong **/*.txt; làm 
    newName=$(sed 's|[/.]|_|g' <<<"$file" | sed 's/_txt$/.txt/')
    cp -- "$file" foo/"$newName" 
xong

Giải trình

  • cho tệp trong **/*.txt; làm: tìm tất cả các tệp (và thư mục, nếu có liên quan) trong thư mục hiện tại có tên kết thúc bằng *.txt.
  • newName=$(sed 's|[/.]|_|g' <<<"$file" | sed 's/_txt$/.txt/') : sử dụng sed để chuyển đổi tất cả /. đến _ trong tên tập tin. Lưu ý rằng tập tin $ ở đây cũng bao gồm đường dẫn, vì vậy nó sẽ giống như case1/0.25/case1.txt và điều đó trở thành case1_0_25_case1_txt. Sau đó chúng tôi chuyển đầu ra của đầu tiên sed sang cái thứ hai chuyển đổi _txt (nếu tìm thấy ở cuối dòng) để .txt, cung cấp cho chúng tôi ``case1_0_25_case1.txt. Đầu ra cuối cùng được lưu trong biến $newName`.
  • cp -- "$file" foo/"$newName": bây giờ chúng tôi sao chép tệp vào thư mục foo/ và với tên mới. Các -- không thực sự cần thiết ở đây, nhưng đảm bảo cách tiếp cận sẽ hoạt động với bất kỳ tên tệp nào, kể cả những tệp có tên bắt đầu bằng a -.

Tôi đã tạo lại cấu trúc thư mục mà bạn hiển thị trong câu hỏi của mình, chạy lệnh trên và nhận được:


cây $
.
âââ trường hợp1
â âââ 0,25
â  â  âââ case1.txt
â âââ 0,30
â  â  âââ case1.txt
â âââ 0,35
â  â  âââ case1.txt
â âââ 0,45
â âââ case1.txt
âââ trường hợp2
â âââ 0,25
â  â  âââ case2.txt
â âââ 0,30
â  â  âââ case2.txt
â âââ 0,35
â  â  âââ case2.txt
â âââ 0,45
â âââ case2.txt
âââ foo
    âââ case1_0_25_case1.txt
    âââ case1_0_30_case1.txt
    âââ case1_0_35_case1.txt
    âââ case1_0_45_case1.txt
    âââ case2_0_25_case2.txt
    âââ case2_0_30_case2.txt
    âââ case2_0_35_case2.txt
    âââ case2_0_45_case2.txt

11 thư mục, 16 tập tin

Đă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.