Можно попробовать это:
ssh-add -L | awk '{ print $2 }' | xargs -i grep '{}' ~/.ssh/authorized_keys | head -1
Хорошо, давайте применим философию Unix. Каковы компоненты этой задачи?
grep
.find
.Большинство программ Unix воздействует на файлы. Таким образом для работы легко на компоненты архива необходимо получить доступ к ним как к файлам, другими словами, необходимо получить доступ к ним как к каталогам.
Файловая система AVFS представляет представление файловой системы где каждый архивный файл /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'\')
применяет КОД к каждому соответствию ШАБЛОНА. Название подобранного файла находится в $REPLY
. Установка reply
массив превращает соответствие в список имен.$REPLY\#
представление каталога архива.$REPLY\#/**/*.pm
соответствия .pm
файлы в архиве.N
спецификатор шарика заставляет шаблон расшириться до пустого списка, если там не идет ни в какое сравнение.Кажется, что я могу сделать это этот путь
find authors/ -type f -exec zgrep "Test::Version" '{}' +
Однако это дает результаты как:
authors/id/J/JO/JONASBN/Module-Info-File-0.11.tar.gz:Binary file (standard input) matches
который не очень конкретен туда, где в tarball. Надо надеяться, кто-то может придумать лучший ответ.
Спасибо за проблему я придумал:
#!/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
– xenoterracide
25.05.2011, 17:43
Возможно, мой ответ будет полезный для кого-то:
#!/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
После установки p7zip-*
вы можете сделать это:
ls | xargs -I {} 7z l {} | grep whatever | less
Вам не нужно использовать ls
перед первым трубопроводом, какой бы список не работал в сжатых файлах. Последний минус
покажет только PATH жизни списка внутри сжатого архива, но не имя этого.
Используйте find, чтобы найти все необходимые файлы, и этот zgrep для просмотра сжатых файлов:
find <folder> -type f -name "<search criteria[*gz,*bz...]>" -execdir zgrep -in "<grep expression>" '{}' ';'
Не тестировал это на tarballs, хотя
~/.avfs
), и доступ к каждому архиву является автоматическим (~/.avfs/path/to/archive.zip\#
обычный каталог в файловой системе AVFS, не точка монтирования). Несомненно, каждый архив, к которому Вы получаете доступ, имеет в виду немного хита производительности, но это внутренне проблеме. красивый – Gilles 'SO- stop being evil' 28.05.2011, 17:31find: missing argument to
- должностное лицо'' и многое из этого от zshzsh: Input/output error: Data-Maker-0.27
– xenoterracide 28.05.2011, 18:36