特定のファイルをgrepし、その特定のファイルをコピーします。

特定のファイルをgrepし、その特定のファイルをコピーします。

これは私のファイルで、出力は次のようになります。ll | awk '{print $9}'

thread_dump_10-10-22_10:00:01*
thread_dump_10-10-22_10:05:01*
thread_dump_10-10-22_10:10:01*
thread_dump_10-10-22_10:15:01*
thread_dump_10-10-22_10:20:01*
thread_dump_10-10-22_10:25:01*
thread_dump_10-10-22_10:30:01*
thread_dump_10-10-22_10:35:01*
thread_dump_10-10-22_10:40:01*
thread_dump_10-10-22_10:45:01*
thread_dump_10-10-22_10:50:01*
thread_dump_10-10-22_10:55:01*
thread_dump_10-10-22_11:00:01*
thread_dump_10-10-22_11:05:01*
thread_dump_10-10-22_11:10:01*
thread_dump_10-10-22_11:15:01*
thread_dump_10-10-22_11:20:01*
thread_dump_10-10-22_11:25:01*
thread_dump_10-10-22_11:30:01*
thread_dump_10-10-22_11:35:01*
thread_dump_10-10-22_11:40:01*
thread_dump_10-10-22_11:45:01*
thread_dump_10-10-22_11:50:01*
thread_dump_10-10-22_11:55:01*
thread_dump_10-10-22_12:00:01*
thread_dump_10-10-22_12:05:01*
thread_dump_10-10-22_12:10:01*
thread_dump_10-10-22_12:15:01*
thread_dump_10-10-22_12:20:01*
thread_dump_10-10-22_12:25:01*
thread_dump_10-10-22_12:30:01*
thread_dump_10-10-22_12:35:01*
thread_dump_10-10-22_12:40:01*
thread_dump_10-10-22_12:45:01*
thread_dump_10-10-22_12:50:01*
thread_dump_10-10-22_12:55:01*

私の問題は、11時30分から12時30分の間にファイルを特定のフォルダにコピーすることです。ソース:/home/Downloads/thread_dumps宛先:/home/test

答え1

コマンドを使用findし、すべてのファイルが同じパターン(時間で終わる)に従うとします。

find /home/Downloads/thread_dumps \( -name  '*11:[3-5][0-9]:*' -o -name '*12:[0-2][0-9]:*' -o -name '*12:30:[0-5][0-9]*' \) -exec cp --target-directory=/home/test {} +

上記のコマンドはファイルをコピーします。12:30:??(時間が12:31以上の場合、ファイルは考慮されません。)

ファイルが必要ない場合は、次の12:30コマンドfindを使用する必要があります。

find /home/Downloads/thread_dumps \( -name  '*11:[3-5][0-9]:*' -o -name '*12:[0-2][0-9]:*' \) -exec cp --target-directory=/home/test {} +

答え2

grepShell globでは、他のコマンドに頼らずに必要なものを入手できますfind。これには、タイムスタンプが12:30のファイルが含まれます。

cp /home/Downloads/thread_dumps/thread_dump_10-10-22_11:[345]* \
   /home/Downloads/thread_dumps/thread_dump_10-10-22_12:[012]* \
   /home/Downloads/thread_dumps/thread_dump_10-10-22_12:30* \
   /home/test

ちなみにここで最後*ワイルドカード*そしてそれはあなたのファイルが持っているように見えるものとは何の関係もありません。

答え3

単にこのファイルをコピーすると、一致するシェルグローブが作成されます。

cp /home/Downloads/thread_dumps/thread_dump_10-10-22_11:[345]?:?? /home/test
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_12:[12]?:?? /home/test
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_12:30:00 /home/test

3つのコマンドにまとめましたが、必要に応じて、3つのソースパターンをすべて同じcpコマンドに入れることができます。 3つの個別の引数に直接入れることも、中{x,y,z}括弧拡張を使用して結合することもできます。ここでやったように:

# Assuming `bash` or `ksh`
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_{11:[345]?:??,12:[12]?:??,12:30:00} /home/test

12:30ファイルを含めない場合は、3番目のコマンド(またはパターン)を省略してください。

この[...]コンポーネントは含まれている文字と一致します。?単一文字と一致します。 (おそらく*ゼロ文字以上の一致に最も慣れているでしょう。)

答え4

そしてzsh

cp thread_dump_10-10-22_??:??:??(e['
  [[ $REPLY[-8,-1] > 11:30 && REPLY[-8,-1] < 12:31 ]]']) /home/test

これはeglob修飾子を使用していくつかのコードの評価に基づいてファイルを選択しますe(考慮するファイルは変数にあります$REPLY)。ここでは、ファイル名の最後の8文字を文字列比較して11:30:00から12:30:59までで終わるファイルを選択します。

関連情報