動的ファイル名を生成して別のディレクトリに書き込む

動的ファイル名を生成して別のディレクトリに書き込む

シェルのコマンドラインからこれを行うことができます。

filename="/home/vikrant_singh_rana/testing/110001_ABC Traffic_04May2020_header_only.csv"
output_filename=$(basename "$filename")

cat "/home/vikrant_singh_rana/testing/110001_ABC Traffic_04May2020_header_only.csv" > /home/vikrant_singh_rana/enrichment_files/"$output_filename"

'/home/vikrant_singh_rana/testing'指定したファイルを読み込み、同じ名前のファイルを別のディレクトリに書き込むことができます。'/home/vikrant_singh_rana/enrichment_files'

シェルスクリプトで同じことをするとき。動作しません

#!/bin/bash

# Go to where the files are located
filedir=/home/vikrant_singh_rana/testing/*
first='yes'
#reading file from directory
for filename in $filedir; do
        #echo $filename
        output_filename=$(basename "$filename")
        #echo $output_filename

#done
done > /home/vikrant_singh_rana/enrichment_files/"$output_filename"

このプログラムを実行すると、このエラーが発生します。

/home/vikrant_singh_rana/enrichment_files/: Is a directory

答え1

パス名拡張()を誤って使用しています*。 muruのコメントによると、ループの内側と外側で変数を混在させています。

#! /bin/bash

source_dir_path='/home/vikrant_singh_rana/testing'
target_dir_path='/home/vikrant_singh_rana/enrichment_files'
cd "$source_dir_path" || exit 1
for filename in *; do
    target_path="${target_dir_path}/${filename}"
    test -f "$target_path" && { echo "File '${filename}' exists; skipping"; continue; }
    cp -p "$filename" "$target_path"
done

関連情報