Tengo muchos archivos tar.gz en un lugar aleatorio y quiero buscar un archivo dentro de todos los archivos tar.gz.
Por ejemplo :
/root/a.tar.gz
/home/backup-2016.tar.gz
/home2/user/files/2015/abc.tar.gz
Buscoarchivoocarpetadentro de ellos
Respuesta1
Puede usar esta frase (bastante larga), reemplazándola PATTERN
con su patrón de búsqueda (no distingue entre mayúsculas y minúsculas a menos que elimine la -i
opción después de grep
):
find / -iname "*.tar.gz" -exec bash -c 'result=$(set -o pipefail ; echo "{}" ; tar -tf {} | grep -i "PATTERN" | sed "s/^/ /") ; test $? -eq 0 && printf "$result\n"' \;
Si no desea buscar en toda su computadora sino solo en un directorio específico (de forma recursiva), puede especificarlo como primer argumento después find
del archivo /
. El .tar.gz
sufijo para que los archivos se procesen tampoco distingue entre mayúsculas y minúsculas, a menos que reemplace el -iname
después find
con name
.
El resultado podría verse así (buscando /usr/share/doc
el patrón default
):
/usr/share/doc/openjdk-8-jre-headless/test-amd64/failed_tests-hotspot.tar.gz
test/langtools/JTwork/tools/javac/lambda/methodReferenceExecution/MethodReferenceTestInnerDefault.jtr
test/langtools/JTwork/tools/javac/lambda/methodReferenceExecution/MethodReferenceTestSuperDefault.jtr
test/langtools/JTwork/tools/javac/lambda/methodReferenceExecution/MethodReferenceTestVarArgsSuperDefault.jtr
test/langtools/JTwork/tools/javac/lambdaShapes/org/openjdk/tests/vm/DefaultMethodsTest.jtr
/usr/share/doc/apg/php.tar.gz
./themes/default.php
Verá la ruta del archivo en una línea seguida de todas las entradas de contenido que coinciden con el patrón, cada una en una línea separada con una sangría de 4 espacios.
Esto también se puede poner en un script (por ejemplo archive-search
, no olvide hacerlo ejecutable con chmod +x FILENAME
):
#!/bin/bash
# Usage: archive-search PATTERN DIRECTORY
find "$2" -iname "*.tar.gz" -exec bash -c '
result=$(
set -o pipefail
echo "{}"
tar -tf {} | grep -i "$0" | sed "s/^/ /"
)
test $? -eq 0 && printf "$result\n"
' "$1" \;
o en una función Bash (por ejemplo archive-search
, añádela a tu ~/.bashrc
si quieres tenerla disponible en cada nueva sesión de Bash):
archive-search () {
# Usage: archive-search PATTERN DIRECTORY
find "$2" -iname "*.tar.gz" -exec bash -c '
result=$(
set -o pipefail
echo "{}"
tar -tf {} | grep -i "$0" | sed "s/^/ /"
)
test $? -eq 0 && printf "$result\n"
' "$1" \;
}
Tanto el script como la función toman el patrón de búsqueda y el directorio como argumentos de línea de comando, como este:
archive-search "default" /usr/share/doc