現在のアドレスフローにより、メールファイルエラーと実際のファイルエラーが発生し、ジョブ内のファイル名を変更できません。
ファイル名:
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.txt
(physicalfiles.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
これらの文字列を次のファイル名に置き換えます。私が選択した唯一の文字列の下には@physical
and@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