我试图找出use Test::Version
cpan中的哪些模块。所以我曾经minicpan
镜像过。我的问题是我需要遍历下载的档案,并grep档案中的文件。谁能告诉我该怎么做?最好以某种方式告诉我档案中的哪个文件以及该文件在哪一行。
(注意:它们不是全部的tarball,有些不是zip文件)
我试图找出use Test::Version
cpan中的哪些模块。所以我曾经minicpan
镜像过。我的问题是我需要遍历下载的档案,并grep档案中的文件。谁能告诉我该怎么做?最好以某种方式告诉我档案中的哪个文件以及该文件在哪一行。
(注意:它们不是全部的tarball,有些不是zip文件)
Answers:
好的,让我们应用Unix哲学。此任务的组成部分是什么?
grep
。find
。大多数Unix程序对文件进行操作。因此,要在存档组件上轻松操作,您需要以文件形式访问它们,换句话说,您需要以目录形式访问它们。
该动静脉瘘文件系统呈现,每一个存档文件中的文件系统的观点/path/to/foo.zip
是作为目录进行访问~/.avfs/path/to/foo/zip#
。AVFS提供对大多数常用归档文件格式的只读访问。
mountavfs
find ~/.avfs"$PWD" \( -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*.pm" -exec grep "$1" {\} +
' {} 'Test::Version' \;
fusermount -u ~/.avfs # optional
说明:
~/.avfs$PWD
,该文件是当前目录的AVFS视图。$0
=档案名称和$1
=搜索模式)。$0#
是档案的目录视图$0
。{\}
而不是{}
在外部find
替换{}
内部-exec ;
参数时需要(有些这样做,有些则没有)。或在zsh≥4.3中:
mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*.pm(.N))
'\')
说明:
~/.avfs$PWD/**/*.(tgz|tar.gz|zip)
与当前目录及其子目录的AVFS视图中的档案匹配。PATTERN(e\''CODE'\')
将CODE应用于PATTERN的每个匹配项。匹配文件的名称在中$REPLY
。设置reply
数组会将匹配项转换为名称列表。$REPLY\#
是档案的目录视图。$REPLY\#/**/*.pm
匹配.pm
存档中的文件。N
预选赛中,使图案水珠扩大到一个空列表,如果没有匹配。~/.avfs
),并且对每个档案的访问是自动的(~/.avfs/path/to/archive.zip\#
是AVFS文件系统上的普通目录,而不是安装点)。当然,您访问的每个档案都对性能造成一点影响,但这是问题的内在原因。
find: missing argument to
从zsh中获得了-exec'`和很多内容zsh: Input/output error: Data-Maker-0.27
感谢您的挑战,我想到了:
#!/bin/bash
#
# tarballs to check in
find authors/ -type f | while read tarball; do
# get list of files in tarball (not dirs ending in /):
tar tzf $tarball | grep -v '/$' | while read file; do
# get contents of file and look for string
tar -Ozxf conform.tar.gz $file | grep -q 'Text::Version' && echo "Tar ($tarball) has matching File ($file)"
done
done
tar (child): conform.tar.gz: Cannot open: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now
也许我的回答对某人有帮助:
#!/bin/bash
findpath=$(echo $1 | sed -r 's|(.*[^/]$)|\1/|')
# tarballs to check in
find $findpath -type f | while read tarball; do
# get list of files in tarball (not dirs ending in /):
if [ -n "$(file --mime-type $tarball | grep -e "application/jar")" ]; then
jar tf $tarball | grep -v '/$' | while read file; do
# get contents of file and look for string
grepout=$(unzip -q -c $tarball $file | grep $3 -e "$2")
if [ -n "$grepout" ]; then
echo "*** $tarball has matching file ($file):"
echo $grepout
fi
done
elif tar -tf $tarball 2>/dev/null; then
tar -tf $tarball | grep -v '/$' | while read file; do
# get contents of file and look for string
grepout=$(unzip -q -c $tarball $file | grep $3 -e "$2")
if [ -n "$grepout" ]; then
echo "*** $tarball has matching file ($file):"
echo $grepout
fi
done
else
file=""
grepout=$(grep $3 -e "$2" $tarball)
if [ -n "$grepout" ]; then
echo "*** $tarball has matching:"
echo $grepout
fi
fi
done
使用find查找所有必需的文件,并使用zgrep查找压缩文件:
find <folder> -type f -name "<search criteria[*gz,*bz...]>" -execdir zgrep -in "<grep expression>" '{}' ';'
虽然没有在tarball上测试