特定の形式の最新のファイルを変数に含めたいです。
はい:/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'
この問題を解決するには、まず正しいパターンから始めて一致する必要がありますls
。grep
ls -tr | grep "file_test_hadoop" > File_List.txt
これにより、最新のファイルが一番下に表示されるリストを含むファイルが作成されます。
tail -n1 File_List.txt
だからあなたのコードはHADOOP_NAME="$(tail -n1 File_List.txt)"