簡體   English   中英

循環遍歷Bash中的目錄

[英]Looping through directories in Bash

我要求腳本cd到一個目錄,然后刪除子目錄中的所有文件,但保留文件夾。 對我需要保留的每個文件使用switch / case有用嗎?

理想情況下,我認為它應該繼續搜索更多的子目錄,而不是我有嵌套循環,只搜索兩個級別。

另一個問題是它跳過帶有空格的文件夾(雖然這不是腳本將運行的卷的問題,現在)。

這是我的代碼:

for i in /Users/YourName/Desktop/Test/* ; do
  if [ -d "$i" ]; then
    cd $i

    for j in "$i"/* ; do
      if [ -d "$j" ]; then
        cd $j

        for k in $(ls *); do
          if [ ! $k == "watch.log" ]; then
            echo $k
            rm -rf $k
          fi
        done

      fi
    done

  fi
done

你應該使用find

for i in $(find . -type d)
do
    do_stuff "$i"
done

如果你真的有很多目錄,你可以將find的輸出傳輸到while read循環中,但是當循環在另一個進程中時,它會使編碼變得更難。

關於空格,請務必引用包含目錄名稱的變量。 這應該允許您處理名稱中包含空格的目錄。

這個怎么樣?

$ find /Users/YourName/Desktop/Test -type f -maxdepth 2 -not -name watch.log -delete


說明

  • -type :僅查找文件
  • -maxdepth :最多下降兩級
  • watch.log -not -name (combo):從搜索中排除watch.log
  • -delete :刪除文件


建議

首先嘗試不使用-delete標志的上述命令。 這將打印出已刪除的文件列表。

一旦您對列表感到滿意,請將-delete添加回命令。

使用find? 您可以使用多個參數,包括深度,文件年齡(如stat),燙發等...

find . -maxdepth 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM