Parent_dir/<name>/<date>/
のようなディレクトリ構造があるとします。
Parent_dir
に配置されたbashスクリプトを使用して、すべての/<name>/<date>/
サブディレクトリを移動し、<name>_<date>.txt
という名前の空のテキストファイルを/<name>/<date>/
サブディレクトリ内に作成するにはどうすればよいですか?
ファイル名を文字通り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
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
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