
次のパターンを持つファイルがたくさんあります。
{UID}-YYMMDD-HHMMSSMM-NEW.xml
または実際の例:
56959-140918-12465122-NEW.XML
ファイル名に含まれる日時順にこのファイルを別のディレクトリにコピーしたいと思います。また、上記のパターンに一致するファイル名にのみ適用したいと思います。
これを行うツールはありますか?そうでなければ、スクリプトなどを使用できるようです。
- 正規表現によるファイル名の一致
- 正規表現で日付部分を照合し、日付別に昇順にリストします。
- 各日付に対して正規表現で時刻を一致させ、時刻の昇順で一覧表示して各ファイルをグローバルリストに追加します。
- ファイルリストのクリーンアップ後のファイルのコピー
答え1
一致するすべてのファイルが現在ディレクトリにある場合(サブディレクトリにない場合、またはサブディレクトリ名にそのファイルが含まれていない場合-
)、手順1〜3を使用できます。
find -regex '.*/[0-9]+-[0-9]+-[0-9]+-NEW\.XML' | sort --field-separator=- --key=2 > filelist
ステップ4:
while IFS= read -r line; do
cp -v $line /PATH/TO/DESTFOLDER/
done < filelist
説明する:正規表現パターンは、find
説明したパターンとすべてのファイルを一致させます。sort
フィールドを区別し、-
最初に2番目のフィールド(日付)で並べ替え、次のフィールド(ここでは3番目のフィールド(時間))で並べ替えます。シェルで行がどのように処理されるかを説明します。ここ。各行は$line
変数に保存され、ターゲットフォルダにコピーされます。オプションは現在コピーされているファイルを-v
表示します。cp
答え2
Zshには1つありますグローバル予選グローブソートを変更します。UID-
プレフィックスを削除されたファイル名でソートするように指示します。
cp <->-<->-<->-NEW.XML(oe\''REPLY=${REPLY#*-}'\') /somewhere/else/
(正確な桁数が必要な場合は、パターンを調整してください。<->
任意の桁数と一致してください。)
ファイルがコピーされる順序は観察できないかもしれません。ほとんどのファイルシステムは少なくとも2番目に細かいタイムスタンプを提供しますが、各ファイルをコピーするのにはるかに少ない時間がかかります。ディレクトリにはファイルの一意の順序はありません。コピーする最初のファイルは必ずしもリストされている最初のファイルである必要はありませんls -f
(ファイルシステムによっては頻繁またはまれに発生する可能性があります)。
答え3
あなたのケースで私が理解したのは、このパターンのあるファイルをファイル名のタイムスタンプに基づいてそのフォルダにコピーする必要があることです。
これを行うには、ファイルを繰り返して各ファイルを適切なディレクトリに移動できます。
for i in [[:digit:]]*-NEW.XML; do dirname="${i%6:6}"; mv $i $dirname; done;
ps励起ループは、渡されたファイルと一致するファイルのみを繰り返します。正規表現。