特定の形式のディレクトリ内のすべての最新ファイル

特定の形式のディレクトリ内のすべての最新ファイル

特定の形式の最新のファイルを変数に含めたいです。

はい:/home/testに5つのファイル:

  • file_test_hadoop_20181130.csv(これはhadoopファイルの最後の修正です)
  • file_test_hadoop_20181130.txt
  • file_test_hadoop_20181130.ini

  • file_test_hub_20181130.txt(txtファイルの最後の修正版です)

  • file_test_hub_20181130.csv
  • File_test_hub_20181130.ini

したがって、私が望む結果は、各タイプで最後に変更された結果です。 HADOOP_NAME=file_test_hadoop_20181130.csv
HUB_NAME=file_test_hub_20181130.txt

だから私は次のことを始めました。

HADOOP_NAME=$(ls -tr /home/test | tail -n 1 | find /home/test -max 深さ 1 -name "file_test_hadoop*" -printf '%f\n')

HUB_NAME=$(ls -tr /home/test | tail -n 1 | find /home/test -max 深さ 1 -name "file_test_hub*" -printf '%f\n')

しかし、ファイルはすべて受け取りました。

答え1

したがって、特定の命名パターンを使用して最近変更されたファイルを検索しようとします。次のコマンドが機能します。

[haxiel@testvm1 ~]$ ls -1t file_test_hadoop* | head -n1
file_test_hadoop_20181130.csv

[haxiel@testvm1 ~]$ ls -1t file_test_hub* | head -n1
file_test_hub_20181130.txt

答え2

次のコマンドを試してください。素晴らしい作品。

ls -ltrh /home/test/file_test_hadoop*| tail -n1
ls -ltrh /home/test/file_test_hub* | tail -n1

答え3

lsを解析するか、lsをパイプして検索して印刷する代わりに、bash配列、シェルワイルドカード、およびYYYYMMDDの自然なソート順を使用してください。

cd /home/test
hadoop_files=(file_test_hadoop*)
HADOOP_NAME=${hadoop_files[-1]}
unset hadoop_files
hub_files=(file_test_hub*)
HUB_NAME=${hub_files[-1]}
unset hub_files
cd -

これにより、さまざまなパターンに一致するファイル名のリストで一時的な配列変数が入力されます。ファイルがまったくないか、予期しないパターン(file_test_hadoop9など)を含むファイルのエラーチェックを追加する必要があります。

答え4

最初のコマンド

ls -tr 

、時間ごとにファイルを正しく一覧表示します。

パイプで接続すると

tail -n1

最後の項目、最新のファイルを正しく選択してください。

問題は、ファイルパターンと一致しても一致しない可能性があることです。

もちろん、最後のコマンドは前のコマンドから入力を受け取らないため、期待どおりに実行され、すべてのファイルが一覧表示されます。

find /home/test -maxdepth 1 -name "file_test_hadoop*" -printf '%f\n'

この問題を解決するには、まず正しいパターンから始めて一致する必要がありますlsgrep

ls -tr | grep "file_test_hadoop" > File_List.txt

これにより、最新のファイルが一番下に表示されるリストを含むファイルが作成されます。

tail -n1 File_List.txt

だからあなたのコードはHADOOP_NAME="$(tail -n1 File_List.txt)"

関連情報