Score:2

ค้นหาไฟล์ทั้งหมดที่มีนามสกุลที่กำหนดในโฟลเดอร์ย่อย และเพิ่มสตริงย่อยที่สอดคล้องกับโฟลเดอร์ย่อย

ธง cn

ฉันมีมากมาย txt ไฟล์กระจัดกระจายไปตามโฟลเดอร์ต่างๆ

- กรณีที่ 1
   |
    - 0.25
       |
        - case1.txt
    - 0.35
       |
        _ case1.txt
    - 0.30 น
       |
        _ case1.txt
    - 0.45
       |
        _ case1.txt

- กรณีที่ 2
   |
    - 0.25
       |
        - case2.txt
    - 0.35
       |
        _ case2.txt
    - 0.30 น
       |
        _ case2.txt
    - 0.45
       |
        _ case2.txt

.
.
.

ฉันต้องการคัดลอกพวกเขาทั้งหมดไปยังโฟลเดอร์ แต่น่าเสียดาย อย่างที่คุณเห็น บางอันมีชื่อเหมือนกันและไร้เดียงสา หา วิธีแก้ปัญหาจบลงด้วยการเขียนทับ ผมขอคัดลอกทั้งหมด txt ไฟล์ไปยังไดเร็กทอรี ฟูโดยใส่ชื่อโฟลเดอร์ย่อยที่อยู่ข้างหน้า .txt การขยาย. นอกจากนี้ เนื่องจากโฟลเดอร์ย่อยมีจุดในชื่อ และฉันต้องคัดลอกไฟล์เหล่านี้ไปยัง Windows ฉันจึงต้องการเปลี่ยน 0.25 ถึง 0_25. กล่าวอีกนัยหนึ่งไฟล์

- กรณีที่ 2
   |
    - 0.25
       |
        - case2.txt

ต้องคัดลอกไปที่ ฟู เช่น case2_0_25.txt. หากโซลูชัน bash ซับซ้อนเกินไป/อ่านไม่ได้ โซลูชัน Python ก็น่าจะใช้ได้เช่นกัน แต่ ไม่ zsh หนึ่ง

Score:3
ธง cn

คุณแบ่งการคัดลอกออกเป็นสองการแปลง โดยขั้นตอนแรกแปลจุดและเครื่องหมายทับเป็นเครื่องหมายขีดล่าง และขั้นตอนถัดไปจะจัดเรียงนิพจน์ย่อยที่ตรงกันใหม่ตามลำดับที่ต้องการ

shopt -s globstar; \
tar -cvf - --show-transformed-names --transform='s![.]!_!g' --transform='s!.*/\([^/]\+\)/\([ ^/]\+\)_txt$!foo/\2_\1.txt!' กรณี*/**/*.txt | น้ำมันดิน -xf -

ตอนนี้มันสำคัญมาก --แปลง ตรงกันหรือไฟล์เหล่านั้นจะผ่านกระบวนการที่ยังไม่ได้ประมวลผล

โซลูชัน Bash จะทำงานในลักษณะเดียวกัน

#!/bin/bash

shopt -s nullglob globstar

mkdir -p ฟู
ขณะอ่าน -rd ''; ทำ
    [[ ${ตอบกลับ//./_} =~ ([^/]+)/([^/]+)_txt$ ]] && 
        cp -va "$REPLY" "foo/${BASH_REMATCH[2]}_${BASH_REMATCH[1]}.txt"
เสร็จแล้ว < <(printf %s\0 case*/**/*.txt)
Score:2
ธง cn

คุณสามารถทำได้ง่ายพอโดยใช้ตัวเลือก globstar ของ bash (จาก ผู้ชายทุบตี):

โกลบอลสตาร์

ถ้ากำหนดรูปแบบ ** ใช้ในบริบทการขยายชื่อพาธจะตรงกับไฟล์ทั้งหมดและไดเร็กทอรีและไดเร็กทอรีย่อยเป็นศูนย์หรือมากกว่า ถ้าแบบตามด้วยก /เฉพาะไดเร็กทอรีและไดเร็กทอรีย่อยเท่านั้นที่ตรงกัน

เนื่องจากเราสามารถใช้ ** ในการค้นหาไฟล์ เราเพียงแค่กำหนดชื่อใหม่โดยรวมถึงชื่อไดเร็กทอรีดั้งเดิมและการเปลี่ยนแปลง . ถึง _:

สำหรับไฟล์ใน **/*.txt; ทำ 
    newName=$(sed 's|[/.]|_|g' <<<"$file" | sed 's/_txt$/.txt/')
    cp -- "$file" foo/"$newName" 
เสร็จแล้ว

คำอธิบาย

  • สำหรับไฟล์ใน **/*.txt; ทำ: ค้นหาไฟล์ทั้งหมด (และไดเร็กทอรี หากเกี่ยวข้อง) ในไดเร็กทอรีปัจจุบันที่มีชื่อลงท้ายด้วย *.txt.
  • newName=$(sed 's|[/.]|_|g' <<<"$file" | sed 's/_txt$/.txt/') : ใช้ เสด เพื่อแปลงทั้งหมด / และ . ถึง _ ในชื่อไฟล์. โปรดทราบว่า $ไฟล์ ที่นี่รวมถึงเส้นทางด้วยดังนั้นมันจะเป็นเช่น case1/0.25/case1.txt และนั่นกลายเป็น case1_0_25_case1_txt. จากนั้นเราจะผ่านเอาต์พุตของอันแรก เสด เป็นครั้งที่สองซึ่งแปลง _txt (หากพบว่าอยู่ท้ายบรรทัด) ถึง .txtให้เรา ``case1_0_25_case1.txt. ผลลัพธ์สุดท้ายจะถูกบันทึกไว้ในตัวแปร $newName`.
  • cp -- "$file" foo/"$newName": ตอนนี้เราคัดลอกไฟล์ไปยังไดเร็กทอรี ฟู/ และด้วยชื่อใหม่ เดอะ -- ไม่จำเป็นจริงๆ ที่นี่ แต่ให้แน่ใจว่าแนวทางนี้จะใช้ได้กับชื่อไฟล์ใดๆ รวมถึงชื่อที่ขึ้นต้นด้วย a -.

ฉันสร้างโครงสร้างโฟลเดอร์ที่คุณแสดงในคำถามของคุณใหม่ เรียกใช้คำสั่งด้านบนและได้รับ:


$ ต้นไม้
.
âââ กรณีที่ 1
€ 0.25
ââ â ââ â âââ case1.txt
â âââ 0.30
ââ â ââ â âââ case1.txt
€ 0.35
ââ â ââ â âââ case1.txt
€ 0.45
â âââ case1.txt
âââ กรณีที่ 2
€ 0.25
ââ â ââ â âââ case2.txt
â âââ 0.30
ââ â ââ â âââ case2.txt
€ 0.35
ââ â ââ â âââ case2.txt
€ 0.45
â âââ case2.txt
âââ ฟู
    âââ 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 ไดเร็กทอรี 16 ไฟล์

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา