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

相关内容