Bash: ディレクトリ名に従ってファイル名を作成する

Bash: ディレクトリ名に従ってファイル名を作成する

次のようなディレクトリ構造があるとしますParent_dir/<name>/<date>/

Parent_dirに配置された bash スクリプトを使用して、すべてのサブディレクトリを移動し、サブディレクトリ内で/<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 */*/2階層下のディレクトリを反復処理できます

  • f=${d/\//_}最初のディレクトリセパレータ/を置き換え_、出力を変数として保存するf

  • "$d"/"${f::-1}.txt"ディレクトリ名に続いて希望のファイル名が展開され、変数から${f::-1}最後の部分を削除します。/f

ディレクトリ区切り文字/が変数 に存在するためd/の は"$d"/"${f::-1}.txt"冗長であることに注意してください。ほとんどすべてのシステムでは を//単一の として扱うため/、これは問題にはなりません。代わりに、 をドリップすることもできます/

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

関連情報