2015-06-20 11 views
-1

我有這些文件:File_1.2.txt,File_1.5.txt,File_2.3.txtFile_4.7.txt文件處理和製作目錄在bash中匹配

我想爲它們製作目錄並將它們排序到目錄中,如下所示。

Dir_001 -> File_1.2.txt File_1.5.txt 

Dir_002 -> File_1.2.txt File_2.3.txt 

Dir_003 -> File_2.3.txt 

Dir_004 -> File_4.7.txt 

Dir_005 -> File_1.5.txt 

Dir_007 -> File_4.7.txt 

因此,一個目錄由文件和包含目錄的匹配數中的所有文件中使用的每個號碼的分類成它。

回答

2
#!/bin/bash 

# If there are no files match File_*.*.txt 
# replace File_*.*.txt by empty string 
shopt -s nullglob 

for i in File_*.*.txt; do 
    echo "processing file $i" 
    IFS="_." read foo num1 num2 foo <<< "$i" 
    printf -v dir1 "Dir_%03d" "$num1" 
    printf -v dir2 "Dir_%03d" "$num2" 
    mkdir -pv "$dir1" "$dir2" 
    cp -v "$i" "$dir1" 
    cp -v "$i" "$dir2" 
done 
+0

@cdarke:謝謝。我已經更新了我的答案。 – Cyrus

+0

您能否給我一個IFS =「_」的簡要說明。閱讀foo num1 num2 foo <<<「$ i」 –

+0

該行使用'_'和'.'作爲字段分隔符,並且分割字符串(例如)來自$ i的'File_1.2.txt'分爲四部分。無用的'File'到$ foo,'1'到$ num1,'2'到$ num2和無用的'txt'再次覆蓋$ foo以避免一個新的變量。 – Cyrus

1

你應該至少自己嘗試過。僅僅複製其他人的代碼並不是學習的好方法。

有幾種方法可以做到這一點,這裏是我的,你的在哪裏?

#!/bin/bash 

function make_dir 
{ 
    #name="Dir00$1" 
    # Cribbed from the answer given by @Cyrus 
    printf -v name "Dir_%03d" "$1" 

    echo "$name" 
    if [[ ! -d $name ]] 
    then 
     mkdir "$name" 
    fi 
} 

# I don't need an array here, but I have no idea where these filenames come from 
filenames=(File_1.2.txt File_1.5.txt File_2.3.txt File_4.7.txt) 

for fname in ${filenames[@]} 
do 
    for seq in {1..999}  # No idea what the upper limit should be 
    do 
     #if [[ $fname == *$seq* ]] 
     # Edit: to handle multi-character sequences 
     if [[ $fname == *[_.]$seq.* ]] 
     then 
      dir=$(make_dir $seq) 
      cp "$fname" "$dir" 
     fi 
    done 
done 

其他人會在這無疑提高。

對函數和序列進行編輯。

+0

這太棒了!我不知道從哪裏開始,並且在過去的幾個小時裏一直在嘗試一些東西,但是沒有解決。我唯一的問題是,如何在名稱=「Dir00 $ 1」中使用類似printf或sprintf的東西,因此一旦我有10個或更多的目錄,它就是Dir010而不是Dir0010。 –

+0

@ChemistnotaProgrammer:看看賽勒斯給出的答案,那應該給你一個線索。我猶豫使用他的方法,因爲那會是抄襲。你應該增加'{1..7}'中的序列 - 你沒有在你的問題中提到數字> 7, – cdarke

+0

@ChemistnotaProgrammer:用'printf -v name'替換'name =「Dir00 $ 1」''Dir_%0.3d 「」$ 1「'。 – Cyrus

相關問題