修正する

修正する

パスを繰り返し繰り返し、tar.gz各ディレクトリから最後に生成されたファイルをインポートするにはどうすればよいですか?

tar -tvf file.tar.gz各ディレクトリで最後に生成されたファイルを実行したいと思います。

すべてのtar.gzファイルは2番目のレベルのディレクトリにあります。したがって、ループの最大深さは2です。

このスクリプトは各ディレクトリを印刷します。

cd $base_dir
find . -type d -printf '%f\n'

デフォルトのディレクトリは であり/var/www/bak、すべての tar.gz ファイルの場所は次のとおりです。

/var/www/bak/site1/www/file.tar.gz
/var/www/bak/site1/db/file.tar.gz
/var/www/bak/site2/www/file.tar.gz
/var/www/bak/site2/db/file.tar.gz

修正する

find_tarballs (){
    cd $base_dir
    find . -name \*.tar.\* -execdir sh -c "echo -n \"\${PWD}/\"; ls -t *.tar.* | head -n 1" \; | sort -u -k1,1
}

filesize (){
    ls -lh $1 | awk -F " " {'print $5'}
}

output="$(find_tarballs)"
set -- $output
shift
for tarball; do
    echo "$tarball"
    if [ ${tarball##*.} = 'gz' ]; then
        list="$(tar -tzf $tarball)"
        echo "Filesize: $(filesize $tarball), Files: $(echo "$list" | wc -l)\n"
        echo 'Press ENTER to list files...'
        read key
        echo "$list"
    else
        echo "Filesize: $(filesize $tarball)"
    fi
    echo ''
done

ベストアンサー1

パスにスペースや改行文字がないとします。

find . -name \*.tar.\* -execdir sh -c "echo -n \"\${PWD} \"; ls -t *.tar.* | head -n 1" \; | sort -u -k1,1

すべてのtarballを検索し、含まれている各ディレクトリで指定されたシェルフラグメントを実行し、各ディレクトリに対して1つの結果のみを保持するように結果をフィルタリングします。

ファイル名にスペースや改行文字が含まれていないと仮定してタールボールの内容を表示するには、次のようにします。

find . -name \*.tar.\* -execdir sh -c "echo -n \"\${PWD} \"; ls -t *.tar.* | head -n 1" \; | sort -u -k1,1 | tr ' ' / | xargs -n 1 tar tvf

パスとファイル名の間のスペースは "/"で置き換えられ、結果は各ファイルで実行されるxargsプログラムに渡されます。tar tvf

各タールボールの間にプロンプ​​トを表示するには、次のコマンドを追加し-pます。xargs

find . -name \*.tar.\* -execdir sh -c "echo -n \"\${PWD} \"; ls -t *.tar.* | head -n 1" \; | sort -u -k1,1 | tr ' ' / | xargs -p -n 1 tar tvf

おすすめ記事