Score:0

How to sort files into directories and subdirectories by name?

ธง id

I'm new to ubuntu and also to the programming world, and I don't really know how to do this!

I have a folder with lots of files named as follows:

000_S_001_mpc_asd.json
000_S_001_mpc_asd.nii
000_S_001_mpc_asd_aa.nii
011_S_001_mpc_asd.json
011_S_001_mpc_asd.nii
011_S_001_mpc_asd_aa.nii
000_S_002_mpc_asd.json
000_S_002_mpc_asd.nii
000_S_002_mpc_asd_aa.nii
000_S_001_dtd_rty.bval
000_S_001_dtd_rty.bvec
000_S_001_dtd_rty.nii
000_S_001_dtd_rty.json
011_S_001_dtd_rty.bval
011_S_001_dtd_rty.bvec
011_S_001_dtd_rty.nii
011_S_001_dtd_rty.json
000_S_002_dtd_rty.bval
000_S_002_dtd_rty.bvec
000_S_002_dtd_rty.nii
000_S_002_dtd_rty.json
011_S_001_flf_lkj.json
011_S_001_flf_lkj.nii
011_S_001_flf_lkj_aa.nii
000_S_001_flf_lkj.json
000_S_001_flf_lkj.nii
000_S_001_flf_lkj_aa.nii
000_S_002_flf_lkj.nii
000_S_002_flf_lkj_aa.nii

Let's say xxx_S_xxx is the principal name, and the rest of the file's name gives secondary information (let's call it a secondary name).

I would like to find a specific name into the secondary name and make a folder with this name (for example mpc, dtd or flf), then make subfolders named as the principal name of each file, and into those folders put the respective files. Probably an image will explain better what I'm trying to say.

So for example, the output for the names I gave you above would look like this:

Desired output:

Is this possible to do from the terminal? I would appreciate your help.

My OS is Ubuntu 20.04 LTS

Score:2
ธง cn

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

#!/bin/bash

ในขณะที่ IFS=_ อ่าน -r a b c d e; ทำ
    mkdir -p target/$d/${a##*/}_${b}_${c}; mv -t $_ ${a}_${b}_${c}_${d}_$e
เสร็จแล้ว < <(printf %s\n files/*)

หรือ นิพจน์ทั่วไปโดยที่อาร์เรย์ BASH_REMATCH บันทึกส่วนที่ตรงกัน อาร์เรย์แรก สมาชิก มีส่วนที่ตรงกับนิพจน์ทั่วไปทั้งหมด สตริงย่อยที่จับคู่โดยนิพจน์ย่อยในวงเล็บถูกกำหนดให้กับสมาชิกต่อไปนี้

#!/bin/bash

สำหรับฉันในไฟล์/*; ทำ
    ถ้า [[ $i =~ ^files/([0-9]+_S_[0-9]+)_(mpc|dtd|flf) ]]; แล้ว
        mkdir -p target/${BASH_REMATCH[2]}/${BASH_REMATCH[1]}; mv -t $_ $i
    ไฟ
เสร็จแล้ว

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

#!/bin/bash

ไฟล์ซีดีในตัว

พิมพ์f %s\0 * | \
awk -F _ ' \
    เริ่มต้น{ RS = ORS = "\0" } { printf("../target/%s/%s_%s_%s\0", $4, $1, $2, $3) } \
' | xargs -0 mkdir -p

# จำไว้ว่าเราได้เปลี่ยนไดเร็กทอรีการทำงานของเราแล้ว
mmv -m '*_S_*_*_*' '../target/#3/#1_S_#2/#1_S_#2_#3_#4'
Score:0
ธง cn

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

แก้ไข: อัปเดตด้วยข้อมูลจากความคิดเห็น สลับรองและหลักด้วยเนื่องจากพวกมันถอยหลัง

แก้ไข 2: ตระหนักว่าในขณะที่ชื่อรองไม่ได้อาศัยตำแหน่งอีกต่อไป ชื่อหลักอาศัยตำแหน่งรอง

#!/bin/bash

input_directory="/path/to/your/data"
output_directory="/path/to/your/output"

ซีดี "$ input_directory"
สำหรับไฟล์ใน *; ทำ

    ถ้า [ ! -f "$ไฟล์" ]; แล้ว
        ดำเนินต่อ;
    ไฟ

    # ใส่ชื่อรองของคุณใน "(mpc|flf|dtd)" คั่นด้วย '|'
    รอง=$(echo "$file" | grep -o -E "(mpc|flf|dtd)");
    princple=$(echo "$file" | grep -o -E "([0-9]+_S_[0-9]+)");
    
    # ข้ามและแจ้งเตือนว่าไม่พบการจับคู่รองสำหรับไฟล์
    ถ้า [ "$ รอง" == "" ]; แล้ว
        echo "ไม่พบคู่รอง!! กำลังข้าม $file";
        ดำเนินต่อ;
    ไฟ

    destination="${output_directory}/$secondary/$princple"

    # สร้างไดเรกทอรีหากไม่มีอยู่
    ถ้า [ ! -d "ปลายทาง $" ]; แล้ว
        mkdir -p "ปลายทาง $";
    ไฟ

    # uncomment เพื่อย้ายไฟล์ไปยังไดเร็กทอรีใหม่หากผลลัพธ์การทดสอบ
    # จาก echo ถูกต้อง
    #mv "$file" "$ปลายทาง"

    # ทดสอบการพิมพ์ผลการย้ายไฟล์
    จาก=$(readlink -f "$file")
    echo "$จาก -> $ปลายทาง/$ไฟล์"
เสร็จแล้ว

grep -o -E "(mpc|flf|dtd)" ค้นหาชื่อไฟล์สำหรับคีย์เวิร์ดชื่อรอง เช่น (mpc, dtd หรือ flf) และบันทึกคำนั้นไปยังตัวแปรรอง

grep -o -E "([0-9]+_S_[0-9]+) แนวคิดเดียวกันโดยมองหารูปแบบ xxx_S_xxx

สามารถเรียกใช้เป็น: ทุบตี script.sh

เดอะ input_directory และ output_directory ตัวแปรจะต้องกรอกด้วยเส้นทางที่ถูกต้อง นอกจากนี้ ฟิลด์ "(mpc|flf|dtd)" ในคำสั่ง grep สามารถเติมด้วยฟิลด์รองอื่นๆ

Al_Mt avatar
id flag
ฉันไม่สามารถรับอะไรได้ อาจเป็นเพราะฉันทำอะไรผิด ฉันบันทึกรหัสนี้เป็นไฟล์ .sh และเรียกใช้จากเทอร์มินัล ./code.sh ฉันผิดไหม
wizardpurple avatar
cn flag
@Al_Mt ฉันเพิ่มคำสั่ง run ตัวอย่าง มันจะไม่สร้างไดเร็กทอรีหรือย้าย/คัดลอกไฟล์ไป มันจะพิมพ์ผลการทดสอบออกมา ฉันไม่แน่ใจว่าคุณต้องการให้ส่งออกไปที่ใด ถ้าคุณต้องการให้ไฟล์ย้ายหรือคัดลอก ฯลฯ
Al_Mt avatar
id flag
ขอบคุณ @wizardpurple ฉันไม่รู้อะไรเลยเกี่ยวกับ bash หรือ shell ดังนั้นฉันจึงพยายามรันโค้ดของคุณ ฉันต้องการย้ายไฟล์ไปยังไดเร็กทอรีที่เกี่ยวข้องใหม่ ฉันคิดว่าค่อนข้างถูกต้อง สิ่งเดียวคือบางครั้งองค์ประกอบของชื่อรองที่ฉันต้องการไม่ได้อยู่ในตำแหน่งที่ 4 แต่อาจแตกต่างกันไป ดังนั้นฉันจึงเลือกคำเฉพาะที่ต้องการ (เช่น find mpc, dtd หรือ flf) แทนตำแหน่ง คุณช่วยฉันด้วยได้ไหม
wizardpurple avatar
cn flag
@Al_Mt รองไม่ควรพึ่งพาตำแหน่งอีกต่อไป ควรพิมพ์การทดสอบเพื่อตรวจสอบความถูกต้องเท่านั้นจนกว่าบรรทัดที่มี ```mv``` จะไม่มีความคิดเห็น
Al_Mt avatar
id flag
นี่เป็นความช่วยเหลือที่ดี !! ขอบคุณมาก!

โพสต์คำตอบ

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