Bash 腳本循環遍歷資料夾並將文件列表為文本

Bash 腳本循環遍歷資料夾並將文件列表為文本

我可以在 Windows CMD 腳本中執行此操作,但現在我透過 Raspberry Pi 進入 Debian。

我想做的是...

(在目前資料夾中)

  • 對於每個子資料夾...
    • 建立一個名為original_filenames.txt的文件
    • 將資料夾名稱回顯到original_filenames.txt中
    • 將所有檔案(包括任何子資料夾)列出到original_filenames.txt

答案1

使用 shell 循環:

for dir in */; do
    { printf '%s\n' "$dir"
      ( cd "$dir" && find . )
    } >"$dir/original_filenames.txt"
done

這會迭代目前目錄中的所有子目錄。循環體輸出目錄的名稱,然後遞歸地輸出該目錄中所有檔案和目錄的清單。此輸出將轉到original_filenames.txt目錄中的檔案。

較短:

for dir in */; do
    find "$dir" >"$dir/original_filenames.txt"
done

這會產生略有不同的輸出,因為寫入檔案的路徑名均以子資料夾的名稱開頭。

如果您對目錄名稱不感興趣而只想常規檔案的路徑名,請在目錄名稱後面使用findwith 。-type f


請注意,如果您打算使用產生任何內容的輸出文件,那麼如果任何找到的路徑名包含換行符(這在 Unix 系統上完全有可能),那麼這將失敗(或至少是非常有問題的)。

答案2

您可以使用find命令和exec選項來執行此操作 - 如下所示:

find . -type d \( ! -name . \) -exec bash -c '
    dirname=$(basename "{}") && 
    cd "{}" && 
    echo "{}" > original_filenames.txt && 
    ls | grep -Fv original_filenames.txt >> original_filenames.txt
' \;

這是您可能會覺得有用的 StackOverflow 貼文:

相關內容