次のようなディレクトリ構造があるとしましょう。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
/
inは、変数にディレクトリ区切り文字があるため重複している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