Điểm:0

How to sort files into directories and subdirectories by name?

lá cờ 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

Điểm:2
lá cờ cn

Trong trường hợp cấu trúc thư mục đích không tồn tại, bạn có thể cắt con đường thành từng mảnh và giống chúng theo thứ tự mong muốn.

#!/bin/bash

trong khi IFS=_ read -r a b c d e; làm
    mkdir -p target/$d/${a##*/}_${b}_${c}; mv -t $_ ${a}_${b}_${c}_${d}_$e
xong < <(printf %s\n files/*)

Hoặc một biểu hiện thông thường, trong đó mảng BASH_REMATCH ghi lại các phần phù hợp. Mảng đầu tiên hội viên chứa phần khớp với toàn bộ biểu thức chính quy. Các chuỗi con khớp với các biểu thức con trong ngoặc đơn được gán cho các phần tử sau.

#!/bin/bash

cho tôi trong tệp/*; làm
    if [[ $i =~ ^files/([0-9]+_S_[0-9]+)_(mpc|dtd|flf) ]]; sau đó
        mkdir -p target/${BASH_REMATCH[2]}/${BASH_REMATCH[1]}; mv -t $_ $i
    fi
xong

Bạn cũng có thể chia quy trình thành hai bước khi bạn bắt đầu bằng cách tạo cấu trúc thư mục trước, awk kết hợp với xargs tối ưu hóa việc sử dụng mkdir và sau đó sử dụng, ví dụ: mmv cho việc đổi tên.

#!/bin/bash

tập tin cd dựng sẵn

printf %s\0 * | \
awk -F _ ' \
    BEGIN{ RS = ORS = "\0" } { printf("../target/%s/%s_%s_%s\0", $4, $1, $2, $3) } \
' | xargs -0 mkdir -p

# Hãy nhớ rằng chúng tôi đã thay đổi thư mục làm việc của mình.
mmv -m '*_S_*_*_*' '../target/#3/#1_S_#2/#1_S_#2_#3_#4'
Điểm:0
lá cờ cn

Tôi không chắc làm thế nào để làm điều đó hoàn toàn trong thiết bị đầu cuối mà không quá khó đọc, nhưng tôi nghĩ bạn có thể nhận được kết quả mà bạn đang tìm kiếm, hoặc ít nhất là bắt đầu, với một số thứ như sau:

Chỉnh sửa: được cập nhật với thông tin từ nhận xét. Cũng hoán đổi thứ cấp và chính vì chúng đã bị ngược.

Chỉnh sửa 2: nhận ra rằng mặc dù tên phụ không còn dựa vào vị trí, nhưng tên chính phụ thuộc vào vị trí của phụ.

#!/bin/bash

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

cd "$input_directory"
cho tệp trong *; làm

    nếu [ ! -f "$file" ]; sau đó
        tiếp tục;
    fi

    # đặt tên phụ của bạn bên trong "(mpc|flf|dtd)" được phân tách bằng '|'
    secondary=$(echo "$file" | grep -o -E "(mpc|flf|dtd)");
    Princple=$(echo "$file" | grep -o -E "([0-9]+_S_[0-9]+)");
    
    # bỏ qua và cảnh báo rằng không tìm thấy kết quả khớp phụ cho một tệp
    nếu [ "$ phụ" == "" ]; sau đó
        echo "Không tìm thấy kết quả khớp phụ!! Đang bỏ qua tệp $";
        tiếp tục;
    fi

    đích="${output_directory}/$secondary/$princple"

    # tạo các thư mục nếu chúng không tồn tại
    nếu [ ! -d "$đích" ]; sau đó
        mkdir -p "$destination";
    fi

    # bỏ ghi chú để di chuyển tệp sang thư mục mới nếu đầu ra thử nghiệm
    # từ tiếng vang là chính xác
    #mv "$file" "$destination"

    # kiểm tra để in kết quả di chuyển tệp
    from=$(readlink -f "$file")
    tiếng vang "$từ -> $đích/$file"
xong

grep -o -E "(mpc|flf|dtd)" tìm kiếm tên tệp cho một trong các từ khóa tên phụ, ví dụ: (mpc, dtd hoặc flf) và lưu từ đó vào biến phụ.

grep -o -E "([0-9]+_S_[0-9]+) Cùng một ý tưởng, bằng cách tìm mẫu xxx_S_xxx.

Nó có thể được chạy như: tập lệnh bash.sh

Các thư mục đầu vàothư mục đầu ra biến sẽ cần được điền vào với các đường dẫn chính xác. Ngoài ra, các trường "(mpc|flf|dtd)" trong câu lệnh grep có thể được điền bằng các trường thứ cấp khác.

Al_Mt avatar
lá cờ id
Tôi không thể nhận được bất cứ điều gì, có lẽ tôi đang làm gì đó sai. Tôi đã lưu mã này dưới dạng tệp .sh và chạy nó từ thiết bị đầu cuối ./code.sh, tôi có nhầm không?
wizardpurple avatar
lá cờ cn
@Al_Mt Tôi đã thêm lệnh chạy ví dụ. Nó sẽ không tạo các thư mục hoặc di chuyển/sao chép các tệp qua. Nó sẽ chỉ in một loại kết quả kiểm tra. Tôi không chắc bạn muốn nó xuất ra ở đâu, nếu bạn muốn các tệp được di chuyển hoặc sao chép, v.v.
Al_Mt avatar
lá cờ id
Cảm ơn bạn @wizardpurple. Chà, tôi thực sự không biết gì về bash hay shell nên tôi chỉ thử chạy mã của bạn. Tôi muốn chuyển các tệp sang thư mục tương ứng mới. Tôi nghĩ là khá chính xác, chỉ có điều là đôi khi thành phần của tên phụ tôi muốn lấy không ở vị trí thứ 4 mà nó có thể thay đổi, vì vậy tôi muốn lấy những từ cụ thể mà tôi muốn (một loại tìm mpc, dtd hoặc flf) thay vì một vị trí. Bạn có thể giúp tôi với điều đó?
wizardpurple avatar
lá cờ cn
@Al_Mt thứ cấp không nên dựa vào vị trí nữa. Nó chỉ nên in một bản kiểm tra để kiểm tra tính chính xác cho đến khi dòng có ```mv``` không bị ghi chú.
Al_Mt avatar
lá cờ id
đây là sự giúp đỡ tuyệt vời!! Cảm ơn bạn rất nhiều!

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