2017-06-18 39 views
0

我有這樣的組織的文件夾:包含如何排除子文件夾 「[XXX] - (YY) - [XXX]」

Folder1 
[xxx] - (aa) - [xxx] 
1.zip 
2.zip 
Folder2 
[xxx] - (bb) - [xxx] 
11.zip 
22.zip 

我需要:

  • 進入每Folderx解壓該文件包含
  • 日誌所提取的文件未成功提取
  • 移動提取的文件到另一個文件夾
  • 如果日誌提取的文件沒有成功移動 如果有任何失敗,我不希望進程。通過

    for D in `find . -type d` 
    do 
        cd $D 
        echo "$(pwd)" 
        for z in *.zip; do 
         unzip -u $z 
         echo "File: " $z; 
         if [ $? -eq 0 ] 
          then 
           echo "Successfully created file" 
          else 
           echo "Could not create file" >&2 
         fi; 
        done 
    done 
    

    我試圖取代一樣多的東西或使用數組等:

我想出了在開始時「找到-maxdepth 1型d」。「發現-maxdepth 1」。但總有一些失敗。

我的主要問題,我想的是,當我嘗試:

$ find . -type d 

我得到這樣的結果:

Folder1 
Folder1/[xxx] - (aa) - [xxx] 
Folder2 
Folder2/[xxx] - (bb) - [xxx] 

但是,當我在我的腳本中使用相同的命令,它解析像這樣相反:

Folder1 
[xxx] 
- 
( 
a 
) 
- 
[xxx] 
Folder2 
[xxx] 
- 
(
bb 
) 
- 
[xxx] 

我從來沒有找到避免在每個空間分裂路徑的方法...

有什麼提示嗎?

在此先感謝

+0

對不起,我可憐的佈局,我想我是非常糟糕的,在使用這種這裏... – druid

+0

前綴代碼/四個空格數據。請看[編輯幫助](http://stackoverflow.com/editing-help)。 – Cyrus

+0

謝謝,我給了它另一個鏡頭,這是更好的我猜...引用不工作得很好...或者至少我不使用,因爲它應該在這裏... – druid

回答

1

因爲你的目錄包含空格,字拆分對它們執行(每行find回報)。請在bash pitfalls頁面上查看此場景的一個很好的說明(for在文件列表上循環)。

一個寫你最for循環的方法是這樣的:

find . -type d | while read D; do 
    cd "$D" 
    ... 
done 

另一種方法,更簡單的操作,是隻使用find-execdir行動,像這樣:

find . -name '*.zip' -execdir unzip -u '{}' \; 

請注意,我們使用execdir動作,該動作在文件目錄中執行命令,而不是exec,它執行com因爲unzip會在當前目錄中提取,除非通過-d選項給出目標目錄。

或者在bash 4+,您可以使用水珠遞歸擴展:

shopt -s globstar 
for z in ./**/*.zip; do 
    dir="$(dirname "$z")" 
    cd "$dir" 
    unzip -u "$z" && echo "OK" || echo "Failed to extract $z" 
done 

另外,不要忘了(幾乎)總是給你的變量

+0

你好,非常感謝, 「find。-type d | while read D; do」讓我走上路,它不起作用(儘管腳本仍然缺少幾件東西 – druid

0

感謝randomir!現在已經解決了主要問題!非常感謝!

這是我到目前爲止已經完成:

BASE=/path/to/my/stuff 

find . -type d | while read D 
do 
    EXTRACTED=0 
    if [[ ! "$D" =~ ^(.*)"[" ]] && [[ ! "$D" =~ ^\.$ ]] 
     then cd $BASE/$D 
      for z in *.zip 
      do 
      unzip -u $z 
       if [ $? -eq 0 ] 
        then 
         echo "ZIP SUCCESS - " $D"/"$z >> $BASE/details.log 
        else 
         echo "ZIP FAILED - " $D"/"$z >> $BASE/details.log 
         EXTRACTED=1 
       fi; 
      done 
     unrar x -o+ *.rar 
     if [ $? -eq 0 ] 
      then 
       echo "RAR SUCCESS - " $D >> $BASE/details.log 
      else 
       echo "RAR FAILED - " $D >> $BASE/details.log 
       EXTRACTED=1 
     fi; 

     if [ $EXTRACTED -eq 0 ] 
      then 
       echo "SUCCESS - " $D >> $BASE/main.log 
      else 
       echo "FAILED - " $D >> $BASE/main.log 
     fi; 
    fi; 
done 
+0

我面對的其中一個挑戰是腳本會嘗試訪問到「。」以及其他子文件夾,我花了一段時間才明白,通過將這個問題解決,我可以很容易地解決,如果「&& [[!」$ D「=〜^ \。$]]」來管理那... – druid

+0

嘗試''find。-mindepth 1 -type d''而不是。它只會返回子目錄,跳過''.''。 – randomir

+0

**請** [總是引用你的變量](http ://mywiki.wooledge.org/BashPitfalls)。例如,寫:'cd「$ BASE/$ D」'',''unzip -u「$ z」'',''echo「成功 - $ D/$ Z「''。 – randomir

相關問題