ファイル名を一意に識別する方法は? [閉鎖]

ファイル名を一意に識別する方法は? [閉鎖]

現在のアドレスフローにより、メールファイルエラーと実際のファイルエラーが発生し、ジョブ内のファイル名を変更できません。

ファイル名:

s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv - Mailing file
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv - Physical file

それが私が求めるものです。上記の2つのファイルがあります。このファイルの名前を2つの異なるファイルに配置する必要があります。 WITHOUT _1ファイルを1つのファイルに入れ、WITH _1ファイルを別のファイルに入れます。

答え1

最初のファイル形式に一致するパターンを繰り返し、各名前を変更して2番目の形式のファイルを選択できます。

#!/bin/sh

rm -f mailfiles.txt
rm -f physicalfiles.txt

for mailfile in s_4800_agency_addresses_*_standard_error.csv; do
    prefix=${mailfile%_standard_error.csv}
    physicalfile="${prefix}_1_standard_error.csv"

    if [ -f "$physicalfile" ]; then
         printf '%s\n' "$mailfile"     >>mailfiles.txt
         printf '%s\n' "$physicalfile" >>physicalfiles.txt
    fi
done

上記のループを繰り返すたびに、上記の2つのファイル名のいずれかのように、パターンに一致する$mailfileファイル名が現在のディレクトリに存在します。s_4800_agency_addresses_*_standard_error.csv

ここで、end以外のすべてのプレフィックスを選択し、_standard_error.csvそのプレフィックスを追加して新しいファイル名を設定します_1_standard_error.csv。結果の名前が既存のファイルに対応する場合、これは$mailfile「メールファイル」と呼ばれ、これが対応する$physicalfile「物理ファイル」であることがわかり、その2つの名前がそれぞれに印刷されますmailfiles.txtphysicalfiles.txtこの結果ファイルは元の削除)。

新しく構築されたファイル名に対応するファイルが存在しない場合は、「物理ファイル」(またはその「物理ファイル」を持たない「メールファイル」)のいずれかに到達して無視されます。

これを実行してください:

$ ls -1
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv

(ここでスクリプトを実行してください)

$ ls -1
mailfiles.txt
physicalfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv

$ cat mailfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_standard_error.csv

$ cat physicalfiles.txt
s_4800_agency_addresses_1_10_2018_14_13_1_standard_error.csv

(読みやすくするために空行を追加しました)

答え2

編集:この質問は元の質問から大幅に変更されました。この時点で、あなたの要件は、2つの出力ファイルに挿入するためにファイル名のペアを収集するようです。

これを行うには、シェルファイルグロービング特徴。シェルオプションを有効にしextglobて、ファイル形式がタイムスタンプの分要素に対して常に2桁の数字である場合、そのケースのファイルglobソリューションは難しくありません。その場合は、以下を試してください。

for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
  mailing=${physical/_1_s/_s}
  # Do your own thing, but for testing ...
  printf "Pair:\n  %s\n  %s\n" "$mailing" "$physical"
  done

要件の次の部分では、各ファイルペアの名前を3番目と4番目の出力ファイルに入力したいようです。この目的のためにprintf単純な出力リストが必要なsed場合、またはより複雑な挿入が必要な場合はそれを使用できます。

最初の(簡単な)ケース:

for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
  mailing=${physical/_1_s/_s}
  printf "%s\n" "$mailing"  >> path/to/your_mailing_list.txt
  printf "%s\n" "$physical" >> path/to/your_physical_list.txt
  done

2番目に複雑な場合は、各出力テンプレートファイルに対して2つの保証された一意の文字列(for$physicalとfor $mailing)を準備し、sedこれらの文字列を次のファイル名に置き換えます。私が選択した唯一の文字列の下には@physicaland@mailingファイルとテンプレートファイルが呼び出され、physical_template.txt最終mailing_template.txt出力は次の形式の一意の名前ファイルになります。result_{$physical or $mailing}.txt:

for physical in *_addresses_+([0-9_])_1_standard_error.csv ; do
  mailing=${physical/_1_s/_s}
  sed "s/@physical/$physical/g" physical_template.txt > result_$physical.txt
  sed "s/@mailing/$mailing/g" mailing_template.txt > result_$mailing.txt
  done

関連情報