![Bash:根據目錄名建立檔案名](https://rvso.com/image/109239/Bash%EF%BC%9A%E6%A0%B9%E6%93%9A%E7%9B%AE%E9%8C%84%E5%90%8D%E5%BB%BA%E7%AB%8B%E6%AA%94%E6%A1%88%E5%90%8D.png)
假設我有一個類似的目錄結構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
將更改任何現有文件的時間戳記。
您可以先進行空運行,替換touch
為echo
:
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