2012-12-12 71 views
0

創建一個shell腳本(sorter.sh),該腳本循環遍歷用戶使用「讀取」內建程序給出的目錄中的所有項目。該輸入需要能夠使用代字號接受目錄。腳本必須驗證輸入並使用循環才能在驗證完成後繼續執行腳本。它必須驗證給出的目錄是一個目錄。將基於第一個字母的文件獲取到目錄中

腳本在迭代目錄中的項目時應測試項目以查看它們是否是目錄或文件。如果它們是目錄,那麼它們需要重新命名以將當前日期添加到目錄名稱的末尾。如果它們是文件,它們需要複製到用戶給出的另一個目錄中,並且強制測試的目的必須是路徑(〜/ Desktop/sorted)。請注意,您無法將此目錄路徑硬編碼到程序中,您必須使用來自用戶的變量。在這個其他目錄中,腳本還必須創建以「cis90-」開頭和a到z結尾命名的目錄。所以前三個目錄將是「cis90-a」,「cis90-b」,「cis90-c」。正在複製的文件需要按字母順序複製到文件夾中。所有以字母「a」開頭的文件進入「cis90-a」文件夾,以字母「b」開頭的文件進入「cis90-b」文件夾,以字母「c」開頭的文件進入「cis90 -c「目錄。爲了節省一些額外的工作後,你到「C」所有額外的文件應該進入「cis90-D」目錄。

我已經得到儘可能遠的地方,我需要去的目錄和文件的項目。不知道如何將文件放入cis90文件夾。這是迄今爲止我所擁有的。

編輯:我現在正在研究使用case命令來分隔目錄和文件。然後將這些文件複製到各自的文件夾中。

#!/bin/bash 

DATE=$(date +%m%d%Y) 

read -p "Enter directory for items to be sorted: " dir 

eval dir=$dir 

while [ -z "$dir" ]; do 
     read -p "Empty entry. Enter directory: " dir 

done 

while [ ! -d "$dir" ]; do 

read -p "Invalid entry. Enter directory: " dir 
done 

read -p "Enter directory for cis90 directories: " cis 

    eval cis=$cis 
     for j in $cis; do 
       mkdir $cis/cis90-{a..z} 
     done 

for i in $dir/*; do 

     if [ -d $i ]; then 
       echo "$i is a directory." 
     fi 
done 
+0

'eval dir = $ dir'&'eval cis = $ cis'的用途是什麼? – anishsane

+0

如果用戶輸入〜 – Shinkin

+0

仍然不需要... 如果dir值類似'/ ls'(基本上,如果它包含命令和特殊字符),它將會失敗。 – anishsane

回答

0

如果是文件,則需要提取基本文件名,然後獲取文件名的第一個字母。一旦你知道第一個字母是什麼,你可以將它複製到適當的目錄中。這可以使用"Parameter Expansion"(類型man bash並搜索參數擴展)完成。

例如,如果文件是foo/bar.txt,則基名稱是bar.txt,第一個字母是b

$ i="foo/bar.txt" 
$ echo "${i##*/}"  # get the basename 
bar.txt 
$ i="bar.txt" 
$ echo "${i:0:1}"  # get the first letter 
b 

這是你更新後的腳本:

#!/bin/bash 
DATE=$(date +%m%d%Y) 

read -p "Enter directory for items to be sorted: " dir 

while [ -z "$dir" ]; do 
    read -p "Empty entry. Enter directory: " dir 
done 

while [ ! -d "$dir" ]; do 
    read -p "Invalid entry. Enter directory: " dir 
done 

read -p "Enter directory for cis90 directories: " cis 

mkdir $cis/cis90-{a..z} 

for i in $dir/*; do 
    if [ -d "$i" ]; then 
     echo "$i is a directory. Moving $i to ${i}_$DATE" 
     mv "$i" "${i}_$DATE" 
    elif [ -f "$i" ]; then  
     filename="${i##*/}" 
     firstletter="${filename:0:1}" 
     echo "Copying $i to $cis/cis90-$firstletter" 
     cp "$i" "$cis/cis90-$firstletter" 
    fi 
done 

,因爲我不相信這是必需的,我也做了等除去eval小號一些變化。

相關問題