私たちは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つのコマンドに置き換えることができます。
smbclient ... dir
- ファイルリストのインポート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秒以上古いと予想されます。
- その行が一致すると、
/ N /
通常のファイル(ディレクトリベース)を見ているようです。 - 行が与えられた正規表現と一致する場合(N、バイトサイズ、タイムスタンプ、その後に行の終わりのみを一致させようとする
$
) - タイムスタンプの抽出
- ファイル名の抽出
- ファイル名から末尾のスペースを削除する
- ファイルのタイムスタンプを秒に変換するには、GNU日付をリクエストしてください。
- 現在のファイルが既存のファイルより古い場合は、タイムスタンプとファイル名を保存してください。
- 最後に、最も古いファイル名を印刷します。
私はこれについて少なくとも2つの問題を知っています。
- 実際のファイル名が空白で終わると(Windowsでも完全に正当であると思われる)、プロセスは失敗します。二つ方法 - awkスクリプトはスペース自体を切り捨て、コマンド置換は末尾のスペースも削除します。
- (ある種の)特殊文字を含むファイルの名前が変更されます。たとえば、という名前のファイルを作成すると、
foo$'\n'bar
smbclientコマンドは代わりにファイル名としてdir
表示されます。FKCEWC~I