2015-09-12 120 views
0

我一直在玩MV,現在我有一種情況。 早些時候,說 Folder1有文件1,2,3。如何刪除每個僅包含一個文件夾的中間文件夾?

現在Folder1具有Folder3,Folder3具有包含file1,2,3的Folder4。

我正在嘗試編寫一個bash腳本,以便識別僅包含1個目錄的中間文件夾,並將其所有內容上移一個級別,最終只返回Folder1-> file1,2,3和其餘文件夾。

我試着寫類似下面,但我:

1.unable到文件和文件夾2.unable之間

區分要查找的文件/目錄名稱保存當前的文件夾

3.不確定如何遞歸。

#!/bin/bash 

echo "Directory Name?" 
read dir_name 

no_files=`ls -A| wc -l` 

if [ $no_file==1 ] && [ itisaDirectory()]; 
then `mv folder_name/* dir_name` 
fi 
+0

提示:如果'$ file'是一個目錄,'[-d「$ file」]'將會爲真。 – tripleee

+0

您的代碼已經包含語法錯誤;請參閱http://shellcheck.net/獲取修補程序。 (雖然它沒有警告''mv'命令周圍的古怪反響。) – tripleee

回答

0

當你不關心錯誤信息,並希望在子目錄將所有文件複製到當前目錄併除去剩餘的空目錄,這樣做

find . -type f -exec mv {} "${dir_name}" \; 2>/dev/null 
rm -r */ 

你問別的東西,僅移動中間目錄唯一的文件。如果只有一個子目錄具有該父目錄,則情況就是如此。目錄的父級可以通過dirname找到。 當一個目錄有一個子目錄時,只有一個子目錄將它作爲父目錄。您可以列出所有目錄,查找父目錄並選擇唯一路徑。

find . -type d -exec dirname {} \; | sort | uniq -u | while read dir; do 
    echo "${dir} has exactly one subdir" 
done 

問題是,目錄也可以有文件。我們試圖提高上述溶液:

find . -exec dirname {} \; | sort | uniq -u | while read dir; do 
    echo "${dir} has exactly one subdir or one file" 
done 

您可以if [ -d "${dir}/*" ]檢驗目錄的內容,但我並不需要知道:

find . -exec dirname {} \; | sort | uniq -u | while read dir; do 
    echo "${dir} has exactly one subdir or one file" 
    find "${dir}"/*/ -type f -exec mv {} "${dir_name}" \; 2>/dev/null 
done 

的路徑$ {DIR}/* /意志只有當$ {dir}有一個子目錄時才存在,並且會移動下面的文件。當$ dir只有一個文件時,find命令將找不到任何內容。

相關問題