リストで最後に変更され、ファイル拡張子が.gzで終わる最後のN行を除外します。

リストで最後に変更され、ファイル拡張子が.gzで終わる最後のN行を除外します。

findAIXでは、このコマンドを使用して次に終わるファイルを除外し、.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解析された出力が推奨されない理由

おすすめ記事