Ank*_*wal 6 linux bash shell tar
我有一个tar存档,非常大~5GB.
我想在存档中grep查看所有文件上的模式(并且还打印具有该模式的文件的名称),但不想通过提取存档来填满我的磁盘空间.
无论如何我能做到吗?
我尝试了这些,但这并没有给我包含模式的文件名,只是匹配的行:
tar -O -xf test.tar.gz | grep 'this'
tar -xf test.tar.gz --to-command='grep awesome'
Run Code Online (Sandbox Code Playgroud)
此外,tar的这个特性记录在哪里?tar xf test.tar $ FILE
Pet*_*lák 11
似乎没人发布这个只处理存档一次的简单解决方案:
tar xzf archive.tgz --to-command \
'grep --label="$TAR_FILENAME" -H PATTERN ; true'
Run Code Online (Sandbox Code Playgroud)
这里tar传递变量中每个文件的名称(参见文档),并用它grep来打印每个匹配项.也true添加,以便tar不会抱怨无法提取不匹配的文件.
这是我对此的看法:
while read filename; do tar -xOf file.tar "$filename" | grep 'pattern' | sed "s|^|$filename:|"; done < <(tar -tf file.tar | grep -v '/$')
Run Code Online (Sandbox Code Playgroud)
分解为:
while read filename; do - 这是一个循环......tar -xOf file.tar "$filename" - 这会提取每个文件......| grep 'pattern' - 这是你放置模式的地方......| sed "s|^|$filename:|"; - 前置文件名,所以这看起来像grep.盐味.done < <(tar -tf file.tar | grep -v '/$')- 结束循环,获取文件列表以至于你的while read.一个附带条件:如果|文件名中包含OR bars(),则会中断.
嗯.事实上,这是一个很好的小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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17350 次 |
| 最近记录: |