2016-09-16 115 views
0

我一直在試圖編寫一段shell腳本並且只是難住了。我在Mac上,並有一些使用UNIX的知識,但我很難過。我有一個文件列表:將文件移動到單獨的子文件夾中

folder1_123 
folder1_abc 
folder2_654 
folder2_zxy 

,我想他們是這樣的:

folder1/123 
folder1/abc 
folder2/654 
folder2/zxy 

到目前爲止,我已經得到了一個腳本,看起來像這樣:

for file in *_.*; do 
dir=${file%%.*} 
mkdir -p "$dir" 
mv "$file" "$dir" 
done 
+1

您當前的腳本有什麼問題? – Inian

+0

你想創建名稱爲'123','abc','654'和'zxy'的空文件嗎?或文件存在? – Inian

回答

0

檢查下面的一個班輪腳本的相同。在包含格式爲_格式的所有文件的目錄中運行此腳本。它將遍歷每個文件名,將在_之前佔據第一部分,並將創建一個具有該名稱的目錄。之後,它將把文件從父目錄移動到新創建的目錄,直到完成所有文件。

for i in `ls |grep _`;do mkdir -p `echo $i|cut -f1 -d "_"`;mv $i `echo $i|cut -f1 -d "_"`/`echo $i|cut -f2 -d "_"`;done 
0

你可以用'cut'分割文件/目錄名:

for file in *_*; do 
    DIRNAME=$(echo $file | cut -d"_" -f1) 
    if [[ ! -d ${DIRNAME} ]]; then 
    mkdir ${DIRNAME} 
    fi 
    FILENAME=$(echo $file | cut -d"_" -f2) 
    mv $file ${DIRNAME}/${FILENAME} 
done 
+0

當'mv'移動文件'123','abc','654'和'zxy'不存在時,這將不起作用。目前尚不清楚OP是否需要創建空文件或者存在原始文件。 – Inian

+0

請提供無法使用的示例。 – chenchuk

+0

並不意味着錯誤的答案,但是對於文件夾folder1_123,腳本將創建一個新文件夾folder1(如果它不存在)(應該是'mkdir -p'),並且文件'123'應該出現在當前文件夾中,以便它被複制到'folder1'。當你試圖移動一個不存在的文件時,'mv'將crib說'沒有這樣的文件..'。這就是爲什麼說,目前還不清楚是否需要創建OP尚未響應的空文件。謝謝。 – Inian

0

你的循環體是錯誤的。它應該是:

dir=${file%_*} 
newfn=${file#*_} 
mkdir -p $dir && mv $file $dir/$newfn 

根據您的要求,您可能會或可能不會想添加一個後衛

if [[ -f $file ]] 
then 
    ... 
fi 

解決這個問題。

相關問題