![Bash: ディレクトリ名に従ってファイル名を作成する](https://rvso.com/image/109239/Bash%3A%20%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%E3%81%AB%E5%BE%93%E3%81%A3%E3%81%A6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B.png)
次のようなディレクトリ構造があるとします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