2012-10-22 35 views
6

Tôi có một tải các tập tintạo thư mục từ tên tập tin và di chuyển bash

BR0200.aaa.tsv 
BR0200.bbb.tsv 
BR0200.ccc.tsv 
BR0210.aaa.tsv 
BR0210.bbb.tsv 
BR0210.ccc.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 

Tôi muốn tạo ra một loạt các thư mục dựa trên phần đầu của tên tập tin lên đến đầu tiên ''

BR0200 
BR210 
W0210 

rồi di chuyển tệp được liên kết vào đúng thư mục (tức là tất cả BR0200. * Tệp đến thư mục BR0200).

Tôi đã bị đâm vào tập lệnh bash nhưng tôi vẫn gặp lỗi. Bất kỳ lời khuyên nào đều được biết ơn khi nhận được.

#!/bin/bash 

for file in BR* W0*; do 
dir = "${file%%.*}" 
if [-e $dir];then 
mv "$file" "$dir" 
else 
mkdir -p "$dir" 
mv "$file" "$dir" 
fi 
done 

Xin lỗi nếu đây là câu hỏi cơ bản. Tôi đã thử tìm kiếm trên web nhưng không có kết quả.

+0

@owlstead Ý của bạn là gì? –

+0

@owlstead globbing là một trong những tính năng hữu ích nhất mà trình bao phải cung cấp. – jordanm

+0

@jordanm bạn đúng, tất nhiên, xóa nhận xét. –

Trả lời

6

Không có khoảng trắng cho phép xung quanh = trong một bài tập.

dir="${file%%.*}" 

Ngược lại, khoảng trắng là yêu cầu trong thử nghiệm.

if [ -e $dir ]; then 
    ^ ^

Theo như những cải tiến về kiểu dáng, nó không làm tổn thương để làm một cần thiết mkdir -p, vì vậy bạn có thể thoát khỏi những tuyên bố if.

Báo giá không bắt buộc trong một bài tập, vì vậy bạn có thể xóa chúng khỏi đường dây dir=. Việc trích dẫn là một ý tưởng hay ở mọi nơi khác, vì vậy đừng xóa các trích dẫn khác.

Có thể thêm một số .* vào vòng lặp for. Bằng cách đó, nếu bạn chạy tập lệnh nhiều lần, nó sẽ không cố di chuyển các thư mục con mới được tạo ra đó. Và một mẹo nhỏ gọn (mặc dù không nhất thiết là cải tiến) là rút ngắn BR*.* W0*.* thành {BR,W0}*.*.

for file in {BR,W0}*.*; do 
    dir=${file%%.*} 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 
0

Bạn có thể thử một cái gì đó như thế này:

for file in BR * WO *; làm dir = $ (echo $ {file} |.. awk -F '{print $ 1}' OFS =) mkdir $ dir mv $ file $ dir làm

tôi đã có một tình huống tương tự và điều này làm việc cho tôi.

Các vấn đề liên quan