これについての私の見解は次のとおりです。
while read filename; do tar -xOf file.tar "$filename" | grep 'pattern' | sed "s|^|$filename:|"; done < <(tar -tf file.tar | grep -v '/$')
説明のために出てきた:
while read filename; do
-それはループです...
tar -xOf file.tar "$filename"
-これにより、各ファイルが抽出されます。
| grep 'pattern'
-ここにパターンを配置します...
| sed "s|^|$filename:|";
-ファイル名を前に付けるので、これはgrepのように見えます。味わう塩。
done < <(tar -tf file.tar | grep -v '/$')
--ループを終了し、ファイルのリストを取得しますwhile read
。
|
1つの条件:ファイル名にORバー()がある場合、これは壊れます。
うーん。実際、これはあなたがあなたのファイルに追加することができる素敵な小さなbash関数を作り.bashrc
ます:
targrep() {
local taropt=""
if [[ ! -f "$2" ]]; then
echo "Usage: targrep pattern file ..."
fi
while [[ -n "$2" ]]; do
if [[ ! -f "$2" ]]; then
echo "targrep: $2: No such file" >&2
fi
case "$2" in
*.tar.gz) taropt="-z" ;;
*) taropt="" ;;
esac
while read filename; do
tar $taropt -xOf "$2" \
| grep "$1" \
| sed "s|^|$filename:|";
done < <(tar $taropt -tf $2 | grep -v '/$')
shift
done
}