2013-01-14 44 views
2

因此,我需要一個簡單的bash腳本根據實際文件夾的內容創建虛擬文件和文件夾。 這裏是我到目前爲止bash根據真實文件創建虛擬文件和文件夾

dir=/mnt/TV 
dummy_dir=/home/bob/Desktop/dummy 

for d in `ls $dir`; do 
    mkdir "$dummy_dir/$(basename $d)" 
done 
for f in `ls -a $dir`; do 
    touch "$dummy_dir/$(basename $f)" 
done 

,但它不能正常工作..感謝

+1

你能比「它不能正常工作」更具體嗎? – kmkaplan

+0

我猜「ls $ dir」的輸出不是你期望的結果。檢查你的別名? – jpmuc

回答

2

而不是使用`cmd`$(cmd)是新的風格,如果可能的話,應使用更清晰,可也嵌套。但我不會使用。

您遇到的問題是,我懷疑,跟你的mkdir,這就要求所有的頂級目錄存在創造了基礎,即

mkdir /tmp/path/here 

需要的/ tmp /路徑存在的,除非之前您使用-p標誌,該標誌創建整個樹,而不管當前存在什麼。

另一個你會發現的問題是隱藏的文件和目錄將被創建爲文件和非隱藏文件和目錄將被創建爲目錄,而不管原始目錄中的文件的類型。

更好的方法是使用find。例如

dir=/mnt/TV 
dummy_dir=/home/bob/Desktop/dummy 

find $dir -type d -printf '%P\n' | \ 
    while read dir; do 
     [[ -d "$dummy_dir/$dir" ]] || mkdir -p "$dummy_dir/$dir" 
    done 

find $dir -type f -printf '%P\n' | \ 
    while read file; do 
     [[ -f "$dummy_dir/$file" ]] || touch "$dummy_dir/$file" 
    done 

第一個find命令將打印出與$ dir子目錄中所有目錄的$ dir相關的路徑。然後將它們傳送到while循環中,該循環測試dummy_dir中是否存在該目錄,如果不存在,則創建該目錄。

第二個find命令將對文件執行相同操作。

注意:這將完全忽略sym鏈接套接字或任何其他不是目錄或常規文件的文件。

如果這不符合您的要求,請更新您的問題以包含更多詳細信息。

+0

請注意,以您的示例爲例,如果目錄或文件名與嵌入的空白字符一起存在,則會中斷。 –

+0

謝謝你這是做我需要的。 我只需要虛擬文件來測試文件重命名腳本。 – dreadycarpenter

0
cp -pvr /mnt/TV /home/bob/Desktop/dummy 

如果您試圖取得比這更多的功能,請在您的問題中指定它。