シェルスクリプトで同じファイル名を持つ複数のファイルをロードする必要がありますが、各ファイル名の前にYYMMDDPERSONNELを追加する必要があります。例: 231102PERSONNEL と 230103PERSONNEL 同じディレクトリに異なるファイルがたくさんあるため、ソート時にファイル名が重要です。ロードするファイルを古いものから最新のものに並べ替える必要があります。
現在私が持っているのは、一度に1つのファイルのみを処理するように設計されています。
答え1
これはパイプを使った簡単な作業です。
find . -maxdepth 1 -type f -name '*PERSONNEL.gz' -print | \
sed -e 's%^./%%' | \
sort | \
xargs -r /bin/echo
man
ページを読んでください。
簡単な概要は次のとおりです。
find
ファイル名リストの印刷STDOUT
sed
もっと見やすくする(./231102PERSONNEL.gz
に変更231102PERSONNEL.gz
)sort
リストを並べ替えます。xargs
できるだけ多くのファイルを配置します(xargs --show-limits </dev/null
参照あなたの制限)リストの残りの部分に対して「コマンド」を繰り返します。/bin/echo
プレースホルダーです。
答え2
デフォルトでは、シェル全体は語彙的に拡張され、あなたの場合、語彙順は年代順(順番に)ファイルはすべて同じ世紀に属している必要があります(例:20世紀が実際には1901年から2000年までであることを無視し、1900年から1999年まで)。
そしてzsh
:
set -o extendedglob
for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) gunzip < $f | your-sql-loader
(または同じ順序でファイルが[0-9](#c6)PERSONNEL.sql.gz(NOn)
必要な場合は、元の要求の逆(大文字)を実行してください)。O
n
o
your-sql-loader
標準入力から入力を取得できるとします。ファイル名パラメータとして渡す必要がある場合:
for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) your-sql-loader <(gunzip < $f)
または、filename引数が通常のファイルである必要がある場合:
for f ( [0-9](#c6)PERSONNEL.sql.gz(N) ) your-sql-loader =(gunzip < $f)
あなたはおそらく次のことができるでしょう:
gunzip -dc -- [0-9](#c6)PERSONNEL.sql.gz | your-sql-loader
つまり、逆並べ替えられたすべてのファイルの圧縮されていないすべてのコンテンツをリンクしますyour-sql-loader
。
より一般的には、圧縮されていないバージョンのファイルをディスクに保存する必要はほとんどありません。すぐに解凍し、同時に使用するすべてのアプリケーションで使用できるようにすることをお勧めします。
コンシューマアプリケーションがデータを順番に読み取らない場合(そうであればここでは驚くべきこと)、ディスクから解凍することができます(=(...)
上記のように一時ファイルから出力を取得する)gunzip
SQL)。
タグが示すように、(t)cshを使用する必要がある場合(この世紀は非常に驚くべきことになります。ファイル名に改行文字が含まれていないと仮定すると):
gunzip -dc -- "`ls -rd -- [0-9][0-9][01][0-9][0-3][0-9]PERSONNEL.sql.gz`" | your-sql-loader
ここでls -r
、ファイルは名前に基づいて逆順にソートされます。対応する"`...`"
出力は検索され、空白ではなく行コンポーネントで区切られます。
6桁の数値の一致に対応するzshまたはkshがcsh
ないため、各番号を具体的に一致させ、月と日の数値をより厳密に一致させる機会を得ます。[0-9](#c6)
{6}([0123456789])
oe[code]
前世紀のファイルがある場合、o+function
またはglob修飾子を使用してzshでカスタムソート順序を定義できます。
[0-9](#c6)PERSONNEL.sql.gz(Noe['REPLY[1,0]=$(( 19 + ($REPLY[1,2] < 70) )'])
つまり、最初の2桁の数字が70より大きいか小さいかどうかに応じて、ファイル名の前に20または19を追加してglobをソートするようにzshに指示します(実際のデータセットの年に応じてカットオフを調整する必要があります)。 ;ここでは、Unix時代の始まりである1970を選択しました。