複数のログファイルを含むディレクトリがあります。このような:
data170213.log
data170214.log
data170215.log
data170216.log
最新のファイルの最後の項目を見て追跡したいと思います。最新のファイルデータ170216.log、私はこれをすることができる
tail -f data170216.log
問題は、ディレクトリ内の最新のファイルの名前が何であるかわからないことです。私はそれを識別できる
ls -1r *.log | head -1
コマンドの結果をどのように送信するかわかりません。ls -1r *.log | ls -1r *.log |ヘッド-1命じる尾 -f [ファイル]
私は成功せずに次のことを試しました。
tail -f < ls -1r *.log | head -1
答え1
使うコマンドの置き換え:
tail -f "$(ls -1r *.log | head -n 1)"
これはls -1r *.log | head -n 1
サブシェルで実行され、出力を取得して新しいコマンドを作成するために使用されます。したがって、ls
出力がパイプされると、data170216.log
コマンドは次のようになります。
tail -f "data170216.log"
それはあなたが望むものです。
head -n 1
代わりに、後者head -1
の形式は廃止されました。
答え2
xargs
この場合に使用できます。簡単で簡単なことは次のとおりです。
$ ls -1r *.log | sed -n 1p | xargs tail -f
または:
$ ls -1r *.log | head -1 | xargs tail -f
どちらもうまくいきます。
バラよりman xargs
はい:
/ tmpディレクトリでcoreというファイルを見つけて削除します。ファイル名に改行やスペースが含まれていると正しく機能しません。
find /tmp -name core -type f -print | xargs /bin/rm -f
/ tmpディレクトリ内またはその下のcoreというファイルを見つけて削除します。このとき、スペースや改行文字を含むファイルまたはディレクトリ名を正しく処理するようにファイル名を処理します。
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
/ tmpディレクトリ内またはその下のcoreというファイルを見つけて削除します。このとき、スペースや改行文字を含むファイルまたはディレクトリ名を正しく処理するようにファイル名を処理します。
find /tmp -depth -name core -type f -delete
/ tmpディレクトリ内またはその下のcoreというファイルを見つけて削除します。しかし、前の例よりも効率的です(rmを起動するためにfork(2)とexec(2)を使用せずに追加のxargsプロセスが必要ないため)
システム内のすべてのユーザーの簡単なリストを生成します。
cut -d: -f1 < /etc/passwd | sort | xargs echo
xargsの標準入力にリストされているファイルを編集するために必要なEmacsの最小コピー数を順番に開始します。この例は、BSDの-oオプションと同じ効果を達成しますが、より柔軟で移植可能な方法です。
xargs sh -c 'emacs "$@" < /dev/tty' emacs