最も古いファイルをsmbclientのlog.txtに入れます。

最も古いファイルをsmbclientのlog.txtに入れます。

私たちは1つのサイトに94台のPCを持っています。フォルダーがあり、各コンピューターのフォルダーで最も古いファイルを確認する必要があります。

すべてのIPを含む.txtファイルを繰り返すことはできますが、最も古いファイルを確認してインポートしてlog.txtに追加する方法がわかりません。このログにあるファイル名が必要です。

while read line; do

IP=$(echo $line | cut -d ';' -f 2)
NAME=$(echo $line | cut -d ';' -f 1)

smbclient  '\\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; get TheOldestFile" >> log.txt 

smbclientを使ってこれは可能ですか?

ベストアンサー1

smbclientコマンドセットがフルシェルを実装していないことを考えると、最良のアイデア(smbaunting共有とローカルシェルユーティリティの使用を除く)は「lsを解析する」ことです。

高レベルでは、単一のsmbclientコマンドを次の2つのコマンドに置き換えることができます。

  1. smbclient ... dir- ファイルリストのインポート
  2. smbclient ... get- 最も古いファイルをインポートします。

私はあなたに似た環境を持っていないので、次のように置き換える「何」を提示します。

filename=$(smbclient '\\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; dir" | awk -f parse-smbclient-ls)
smbclient '\\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; get $filename"

構文解析-smbclient-lsの内容は次のとおりです。

BEGIN {
  "date +%s" | getline oldesttime
}

/ N / {
  #                      size           thu             mar             dd              dd:dd:dd                                dddd
  if (match($0, / N +[[:digit:]]+ +[[:alpha:]]{3} [[:alpha:]]{3} +[[:digit:]]+ [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2} [[:digit:]]{4}$/)) {
    timestamp=sprintf("%s %s %s %s %s", $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF)
    filename=substr($0, 3, RSTART-3)
    # trim trailing whitespace -- *** hope the real filename doesn't end in whitespace
    sub(/ +$/, "", filename);
    ("date --date='"timestamp"' +%s") | getline seconds
    if (seconds < oldesttime) {
        oldesttime=seconds
        oldestfile=filename
    }
  }
}

END {
  print oldestfile
}

awkスクリプトに入ります。

  1. 現在最も古い日付値を現在時刻に初期化します。最も古いファイルは少なくとも1秒以上古いと予想されます。
  2. その行が一致すると、/ N /通常のファイル(ディレクトリベース)を見ているようです。
  3. 行が与えられた正規表現と一致する場合(N、バイトサイズ、タイムスタンプ、その後に行の終わりのみを一致させようとする$
  4. タイムスタンプの抽出
  5. ファイル名の抽出
  6. ファイル名から末尾のスペースを削除する
  7. ファイルのタイムスタンプを秒に変換するには、GNU日付をリクエストしてください。
  8. 現在のファイルが既存のファイルより古い場合は、タイムスタンプとファイル名を保存してください。
  9. 最後に、最も古いファイル名を印刷します。

私はこれについて少なくとも2つの問題を知っています。

  1. 実際のファイル名が空白で終わると(Windowsでも完全に正当であると思われる)、プロセスは失敗します。二つ方法 - awkスクリプトはスペース自体を切り捨て、コマンド置換は末尾のスペースも削除します。
  2. (ある種の)特殊文字を含むファイルの名前が変更されます。たとえば、という名前のファイルを作成すると、foo$'\n'barsmbclientコマンドは代わりにファイル名としてdir表示されます。FKCEWC~I

おすすめ記事