web-dev-qa-db-ja.com

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

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

Parent_dirに配置されたbashスクリプトを使用して、すべての/<name>/<date>/サブディレクトリを移動し、<name>_<date>.txtという名前の空のテキストファイルを/<name>/<date>/サブディレクトリ内に作成するにはどうすればよいですか?

2
Austin

ファイル名を文字通り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
2
Tal

Parent_dirから:

for d in */*/; do f=${d/\//_}; touch -- "$d"/"${f::-1}.txt"; done

touchは既存のファイルのタイムスタンプを変更することに注意してください。

最初にtouchechoに置き換えることで、予行演習を行うことができます。

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
3
heemayl
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
1
user218374