Bash:根據目錄名建立檔案名

Bash:根據目錄名建立檔案名

假設我有一個類似的目錄結構Parent_dir/<name>/<date>/

如何使用放入的 bash 腳本Parent_dir來瀏覽每個/<name>/<date>/子目錄並建立一個<name>_<date>.txt/<name>/<date>/子目錄中命名的空白文字檔案?

答案1

來自Parent_dir

for d in */*/; do f=${d/\//_}; touch -- "$d"/"${f::-1}.txt"; done

請注意,這touch將更改任何現有文件的時間戳記。

您可以先進行空運行,替換touchecho

for d in */*/; do f=${d/\//_}; echo -- "$d"/"${f::-1}.txt"; done
  • for d in */*/讓我們迭代兩層目錄

  • f=${d/\//_}將第一個目錄分隔符號替換/_並將輸出儲存為變數f

  • "$d"/"${f::-1}.txt"擴展為目錄名,後面跟著所需的檔案名稱;${f::-1}去掉/變數中的最後一個f

/請注意,由於變數中存在目錄分隔符d,因此/in"$d"/"${f::-1}.txt"是多餘的;由於幾乎所有系統都採用//single /,這應該不是問題。或者,您可以滴/

for d in */*/; do f=${d/\//_}; touch -- "${d}${f::-1}.txt"; done

答案2

如果您希望檔案名稱按字面意思命名name_date.txt,請嘗試以下操作:

#!/bin/bash
for dir in $(find . -maxdepth 2 -mindepth 2 -type d)
do
    touch "$dir"/name_date.txt
done

如果您希望檔案名稱是<name>_<date>.txt,請改為執行下列操作:

#!/bin/bash
IFS=$'\n'
for dir in $(find . -maxdepth 1 ! -path . -type d)
do
    for subdir in $(find "$dir" -mindepth 1 -type d)
    do
        base_dir=$(basename $dir)
        base_subdir=$(basename $subdir)

        touch "$base_dir"/"$base_subdir"/"$base_dir"_"$base_subdir".txt
    done
done

答案3

find . -type d -exec sh -c '
   case ${1//[!\/]/} in
      "//" ) f=${1:2}; f=${f/\//_}; :> "$1/$f.txt" ;;
      * ) false ;;
   esac
' {} {} \; -prune

for d in */*/; do
   f=${d/\//_}
   :> "${d%?}/${f%?}.txt"
done

相關內容