假设我有一个类似的目录结构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