find
AIXでは、このコマンドを使用して次に終わるファイルを除外し、.gz
リストから最後の2行も除外する必要があります。たとえば、ディレクトリには次のものがあります。
shop14_0_Log0002019754.gz
shop14_0_Log0002019755.gz
shop14_0_Log0002019756.gz
shop14_0_Log0002019757
shop14_0_Log0002019758.gz
shop14_0_Log0002019759.gz
shop14_0_Log0002019760.gz
shop14_0_Log0002019761.gz
shop14_0_Log0002019762
圧縮されていないファイルのみを検索し、下部の最後の2つのファイルを除いて以下のような出力を取得したいと思います。
出力コマンドは次に到達する必要があります。
shop14_0_Log0002019757
そのコマンドを使用して最後の2行を除外できますが、ls
名前で終わるファイルを除外するにはどうすればよいですか.gz
? AIX / UNIXでこれを行う方法を見つけようとしています。
ls -ltr | awk '{print $9} | sed '$d' | sed '$d'
を使用すると、リストから除外して圧縮されていないファイルのリストをfind
取得できますが、.gz
これには不要な最後の2つのファイルが含まれています。
find . -type f ! -name '*\.gz' -print
上記find
のコマンドは以下を返します。
./shop14_0_Log0002019757
./shop14_0_Log0002019762
そのファイルはshop14_0_Log0002019762
リストから除外する必要がありshop14_0_Log0002019761
、圧縮されていない場合でもリストから除外する必要があります。
除外する「最後の2つ」の項目は、ファイル変更時間に基づいてソートされます。私の究極の目標は、圧縮されていないファイルを圧縮することです。
どうすればいいですか?
ベストアンサー1
Bashを使用していて、ファイル名に改行や空白が含まれていないことを100%確信している場合は、次のようにします。
shopt -s extglob
ls -t !(*gz) | tail -n +3 | while IFS= read -r file; do gzip "$file"; done
拡張ワイルドカードを有効にして「gzで終わらない」をshopt -s extglob
提供します。!(*gz)
次に、を使用して、ls -t
変更時刻に基づいて最新の項目からソートします。これは、tail -n +3
「3行目から始まるすべてのコンテンツを印刷する」という意味なので、最初の2つのファイルはスキップされます。最後に、ファイルのループwhile
にパイプします。gzip
または、次のことができます。
gzip $(ls -t !(*gz) | tail -n +3)"
または
ls -t !(*gz) | tail -n +3 | xargs gzip
これは、ファイル名が正しいことを確認できる場合にのみ機能します。バラよりhttps://mywiki.wooledge.org/ParsingLsls
解析された出力が推奨されない理由