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ào
và thư 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.