2012-07-28 90 views
1

下面是一個較大的腳本的片段,它導出用戶指定目錄的子目錄列表,並在用戶指定的另一個用戶指定的目錄中提示用戶之前提示用戶目錄。從文件列表變量中刪除所有非目錄

COPY_DIR=${1:-/} 
DEST_DIR=${2} 
export DIRS="`ls --hide="*.*" -m ${COPY_DIR}`" 
export DIRS="`echo $DIRS | sed "s/\,//g"`" 
if [ \(-z "${DIRS}" -a "${1}" != "/" \) ]; then 
    echo -e "Error: Invalid Input: No Subdirectories To Output\n"&&exit 
elif [ -z "${DEST_DIR}" ]; then 
    echo "${DIRS}"&&exit 
else 
    echo "${DIRS}" 
    read -p "Create these subdirectories in ${DEST_DIR}?" ANS 
    if [ ${ANS} = "n|no|N|No|NO|nO" ]; then 
    exit 
    elif [ ${ANS} = "y|ye|yes|Y|Ye|Yes|YE|YES|yES|yeS|yEs|YeS" ]; then 
    if [ ${COPYDIR} = ${DEST_DIR} ]; then 
     echo "Error: Invalid Target: Source and Destination are the same"&&exit 
    fi 
    cd "${DEST_DIR}" 
    mkdir ${DIRS} 
    else 
    exit 
    fi 
fi 

但是,命令ls --hide="*.*" -m ${COPY_DIR}也打印列表中的文件。有沒有什麼方法來重新命名這個命令,以便它只打印出目錄?我試過ls -d,但那也行不通。 任何想法?

回答

0

你不應該依靠ls的輸出來提供文件名。請參閱以下內容,以便不要解析lshttp://mywiki.wooledge.org/ParsingLs

您可以使用GNU find的-print0選項安全地構建目錄列表,並將結果附加到數組中。

dirs=() # create an empty array 
while read -r -d $'\0' dir; do # read up to the next \0 and store the value in "dir" 
    dirs+=("$dir") # append the value in "dir" to the array 
done < <(find "$COPY_DIR" -type d -maxdepth 1 -mindepth 1 ! -name '*.*') # find directories that do not match *.* 

-mindepth 1阻止查找匹配$ COPY_DIR本身。

+0

完美!它工作得很好。謝謝。 – reap3r119 2012-08-03 17:02:57

相關問題