2013-08-22 42 views
0

我有一個文件全是文件名和目錄名。 實施例:bash/linux - 從文件中的字符串touch/mkdir

DIR,/mnt/sdcard/mydir1/ 
DIR,/mnt/sdcard/mydir2/ 
DIR,/mnt/sdcard/mydir3/ 
FILE,/mnt/sdcard/mydir1/file1.txt 
FILE,/mnt/sdcard/mydir2/file1.txt 
FILE,/mnt/sdcard/mydir3/file1.txt 

與目錄和文件名的總周圍30.000條目。 我需要在指定的文件夾內創建所有的目錄,子目錄和文件(空的)。我也想跳過所有已經存在的目錄/文件!

目前我有這個,但我希望有一個更好的辦法,因爲這是非常緩慢的 並消耗大量的CPU:

#!/bin/bash 
cd /home/mydir/dummydir/ 

for file in *.tree.txt; do 

MEMBER=$(echo $file | cut -d '.' -f1) 
DIRECTORY=/home/mydir/dummydir/$MEMBER 

while read line 
do 

if [[ $line == FILE,* ]] 
then 

CUTOFFILE=$(echo "$line" | cut -c 6-) 
touch "$DIRECTORY$CUTOFFILE" 

else 

CUTOFFDIR=$(echo "$line" | cut -c 5-) 
if [[ ! -d "$DIRECTORY$line" && $line == DIR,* ]]; then 
mkdir -p "$DIRECTORY$CUTOFFDIR" 
fi 


fi 

done < $file 
done 

回答

3
#!/bin/bash 
cd /home/mydir/dummydir/ 

for file in *.tree.txt; do 
    dir=${file%.tree.txt} 

    while IFS=, read type path; do 
     case $type in 
      FILE) touch "$dir/$path";; 
      DIR) mkdir -p "$dir/$path";; 
      *) echo "bad line: $type,$path" >&2;; 
     esac 
    done < "$file" 
done 

我不是一個巨大的風扇cut,所以我用其他解析方法替換了它。

  • 具有包含由逗號隔開的兩個字段每個行中,可以通過具有read解析線和兩個部分存儲在單獨的變量切出了大量的代碼。您可以通過臨時覆蓋$IFS變量IFS=,來告知read使用,作爲字段分隔符。然後read type path將這兩部分讀入$type$path

  • touchmkdir -p在應用於已存在的文件或目錄時都沒有危害,因此您可能會忽略對現有文件的檢查並始終執行它們。

  • 由於您通過cd開始腳本到/home/mydir/dummydir,您以後不需要重複該操作。

  • ${file%.tree.txt}是一種較短的剝離方法.tree.txt。另一種方式是$(basename "$file" .tree.txt)

+0

這是非常有用的信息。小巧,高效,簡單。我希望能夠提高創建文件和文件夾的速度,這就是我運行「時間」來比較它們時得到的結果; ./create_tree2.sh =真實0m29.650s ./create_tree.sh =真實1m15.243s ...帽子關了,你真的幫了我:) – ole

+0

順便說一句,會暫停與CPU負載的幫助? – ole