パスを繰り返し繰り返し、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
答え2
zsh
一般的な書き込み専用の方法でを使用してください。
for dir (*/*(N/)) (){(($#)) && tar tvf $1} $dir/*.tar.gz(Nom[1])
for var (values) cmd
: 略語for var in values; do cmd; done
(N/)
,(Nom[1])
: グローバル修飾子N
: 一致するものがない場合は nullglob に展開されます。/
:ディレクトリのみom
:修正時間順に並べ替え(最新順)[1]
:最初の一致のみ
(){...} args
:パラメータを持つ匿名関数。
GNUツール(ファイル名に含めることができるバイトについてはまだ想定していませんが、隠しディレクトリを参照して隠しtar.gz
ファイルを含む)とBourneに似たシェルを使用すると、次のようになります。
LC_ALL=C find . -mindepth 3 -maxdepth 3 -name '*.tar.gz' -printf '%T@:%p\0' |
sort -zn | LC_ALL=C awk -v RS='\0' -v ORS='\0' '
{match($0, ":((.*)/.*)", parts); newest[parts[2]] = parts[1]}
END {for (dir in newest) print newest[dir]}' |
xargs -r0n1 tar tvf