基本的に私の要件は、10個の最新のログを見つけてzipに圧縮することです。コマンドを試しましたが、ls -Lt | head -10 | zip log.zip *.log
出力が一致しません。
答え1
現在のディレクトリから10個の最新(一般)ファイルを安全に選択するには、を使用することをお勧めします。zsh
これは、修正時間に基づいてファイルを安全かつデフォルトで選択するためです。
zsh -c 'zip log.zip *.log(.om[1,10])'
これは、zshの2つのワイルドカード(「glob」)修飾子と下付き文字演算子を使用します。
*.log( ... )
- ワイルドカードで始まります。現在の*.log
ディレクトリで次に終わるファイルをすべて選択し、次にフィルタリングします。.log
.
- 一般ファイルのみを含むように結果リストをフィルタリングします。om
- 修正時間に基づいて結果リストを並べ替え(「並べ替え」)し、最新の項目から並べ替えます。[1,10]
- 要素1〜10(最も最近の10ファイル)を選択して結果リストを絞り込みます。
zshが10個の最新の一般ファイルを生成すると、それをコマンドに渡しますzip
。
脚注:
- デフォルトでは、zshは隠し(ドット)ファイルを選択しません。たとえば、
.foo.log
次のようなファイルがある場合。そしてこれを選択するには、D
グローバル修飾子(*.log(.Dom[1,10])
)を含めるか、GLOB_DOTS
オプションを設定(使用setopt globdots
)できます。
答え2
最初バックアップする
以下を試してください。
ls -Lt | head -10 | xargs zip log.zip
注文
zip log.zip *.log
現在のディレクトリで終わるすべてのファイルを圧縮しようとすると、.log
STDINはファイル名を取得しません。
ディレクトリに混合ファイル、つまりログファイル以外のファイルがある場合は、次のことを試すことができます。
ls -Lt *.log | head -10 | xargs zip log.zip
答え3
次のコマンドを試してください
ls -ltrh| awk '$1 ~ /-rw/{print $0}'|sed -n '1,10p'| awk '{print "zip" " " $NF".zip" " " $NF}'| sh