ある場所から別の場所にファイルをコピーしようとしています。以下はいくつかの例です。
aaa_bbb_ccc_ddd_cost_code_20140330.gz
aaa_bbb_ccc_ddd_revenue_zone_20140329.gz
aaa_bbb_ccc_ddd_benefit_extract_20140330.csv.gz
aaa_bbb_ccc_ddd_profit_zone_20150509.csv.gz
aaa_bbb_ccc_ddd_loss_zone_20140330.csv
aaa_bbb_ccc_ddd_username.csv.gz
上記のリストからコピーする必要があるファイルは、次の形式でなければなりません。
aaa_bbb_ccc_ddd_cost[or]revenue[or]benefit[or]profit[or]loss_yyyymmdd.csv.gz
これはファイルを意味します。
aaa_bbb_ccc_ddd_loss_zone_20140330.csv
aaa_bbb_ccc_ddd_username.csv.gz
コピーしないでください。
また、変数に割り当てる必要がありますが、次のように試していますが、うまくいかないようです。
FILENAME="egrep 'aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit)_code_[0-9]{8}.csv.gz'"
変数に割り当てる理由は、後で次のようにコードで使用する必要があるためです。
SOURCE_DIR="/temp"
DESTN_DIR="/output"
FILENAME=`egrep 'aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit)_code_[0-9]{8}.csv.gz'`
echo "FILENAME is:" $FILENAME
for SAMPLE_FILE in $(ls "$SOURCE_DIR/$FILENAME")
do
cp $SAMPLE_FILE $DESTN_DIR
done
これを達成する他の方法はありますか?
ベストアンサー1
Usefind
と-exec
そのオプション(ここではGNUを述語find
として使用-regex
):
find . -regextype posix-egrep -regex '.*/aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit|loss)_[[:alpha:]]+_[0-9]+\.csv\.gz' -exec mv {} "$DESTN_DIR" \;
メモ:
find .
find
現在のディレクトリから検索するファイルを知らせます。デフォルトでは、GNUは
find
emacsスタイルの正規表現を使用します。私はを好む-regextype posix-egrep
が、サポートされているおなじみのスタイルに切り替えることができます。正規表現を使用してファイルを選択します。
-regex '.*/aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit|loss)_[[:alpha:]]+_[0-9]+\.csv\.gz'
標準プレフィックスaaa_bbb_ccc_ddd_
の後に指定された単語の1つ(cost|revenue|benefit|profit|loss)
、指定されていない他の単語、_[[:alpha:]]+
日付、_[0-9]+
最後に希望の拡張子が続きます.csv.gz
。これを微調整する必要があるかもしれません。見つかったすべてのファイルはターゲットディレクトリに移動されます
-exec mv {} "$DESTN_DIR" \;
。一致するファイルが見つかったら、find
このコマンドを実行して{}
ファイルの名前を変更します。これは、ファイル名にスペース、改行、またはその他の読み取れない文字が含まれている場合にも機能します。
正規表現を使用したデフォルト(emacs)スタイル
GNU正規表現のデフォルトスタイルには、find
グループ化と代替演算子のいくつかのエスケープが必要です。
find . -regex '.*/aaa_bbb_ccc_ddd_\(cost\|revenue\|benefit\|profit\|loss\)_[[:alpha:]]+_[0-9]+\.csv\.gz' -exec echo mv {} targetdir \;
アップルコンピュータ
Mac OSX バージョンfind
(マニュアルページはこちら)はサポートされていますが、-regex
サポートされていません-regextype
。しかし、正規表現の構文に少しの変更が必要な場合でも驚くことはありません。
IBM AIX 5
IBM AIXバージョンのマニュアルページfind
は次のとおりです。ここ。もちろんいいえサポートする-regex
。