2 votos

Buscar/descomprimir/borrar script</strkeep><strkeep>

Soy un converso al PC, y bastante novato cuando se trata de scripts de shell/bash, pero realmente quiero aprender/entender más.

Mi necesidad: Necesito ser capaz de escanear una carpeta, encontrar cualquier archivo .rar, extraer los archivos en su lugar, y eliminar el .rar asociado después. Cada uno de ellos puede tener también los archivos .r00, .r01, ... asociados, por lo que estos también deben ser eliminados después.

¿Puede alguien ayudarme a averiguar (y entender) cómo escribir un script para esto? Cuantos más comentarios, mejor.

4voto

Justin Love Puntos 3073

Podrías hacer algo así:

find . -iname '*.rar' | xargs unrar x

find . -iname '*.r*' | xargs rm -f

el script funciona de la siguiente manera: busca recursivamente los archivos rar en el directorio en el que te encuentras (el punto) envía todos los resultados a una lista de argumentos (xargs) que se pasa al comando 'unrar'

Lo mismo en la segunda línea, pero ahora se pasa a eliminar (rm). La bandera -f hace que los archivos se eliminen instantáneamente, no se le pedirá permiso. El rm -f es un comando poderoso que debe usar con cuidado, así que piense en lo que eliminaría si lo ejecutara antes de borrarlo, o simplemente pruebe esto haciendo:

find . -iname '*.r*'

Una cosa sobre el comando unrar: unrar no es un comando estándar en Mac OSX (no estoy seguro si es el caso en otras distribuciones de Linux/Unix), así que asegúrate de tenerlo instalado en tu máquina.


Nota: Hay una fina pero importante diferencia entre find . -iname *.r* y find . -iname '*.r*' relacionado con la forma en que los shells de Unix manejan los comodines:

  • En la primera forma, los comodines son expandidos por el shell (por lo que el shell buscará todos los archivos/carpetas que coincidan *.r* en el directorio actual y pasarlos como parámetros a find . Esto funcionará bien si hay un solo archivo para comparar, pero fallará si hay varios (porque entonces la llamada es find . -iname foo.rar bar.rar pero -iname sólo toma un argumento).
  • En la segunda forma el patrón (sin el '' ) se pasa a find y la expansión de los comodines se realiza mediante find (que luego trata de hacer coincidir todos los archivos que encuentra).

Así que en general los patrones pasados a find debe estar encerrado en '' para producir el resultado deseado.

3voto

Supongo que sólo quiere escanear la carpeta actual (y no todas las demás carpetas que están debajo de ella):

for rarfile in *.rar; do
    unrar x "$rarfile"
done

La clave es poner el nombre del archivo en "" al pasarlo a unrar para evitar cualquier problema con los espacios en el nombre.

Ahora bien, si quieres tener esto como un script que puedas ejecutar, puedes hacer lo siguiente

 cd ~
 mkdir .bin 
 echo 'PATH=$PATH:$HOME/.bin' >> .profile
 echo 'export PATH' >> .profile
 . ./.profile
 nano .bin/extract_all_rars

Esto le da un editor simple para archivos de texto, los comandos esenciales se muestran en la parte inferior. Escriba

 #!/bin/bash

seguido del bloque de código en la parte superior, guarde el archivo y salga. Luego (en el shell de nuevo) escriba

 chmod +x .bin/extract_all_rars

para marcarlo como ejecutable (para que el shell lo reconozca como un comando).

El borrado automático tiene una advertencia: unrar no devuelve un estado de error si las cosas van mal, por lo que puede perder sus archivos rar. Si esto no es un problema, añadir

 rm -f "$rarfile" ${rarfile%%.rar}.r{0..9}{0..9} 

después de la unrar en el bucle anterior hará el trabajo. El segundo parámetro se utiliza para crear todos los posibles .r04 quitando primero el sufijo ( ${rarfile%%.rar} ) y luego iterar de 0 a 9 dos veces para obtener todas las combinaciones posibles (ejecutar echo foo{0..9} en bash para ver cómo funciona). Como la mayoría de estos nombres de archivo no existen, he añadido -f como opción para evitar los mensajes de error.

Si está bastante seguro de que no hay otros archivos con un .rXX están en el mismo directorio, un simple

rm -${rarfile%%.rar}.r??

también hace el truco.


Si no tiene rar / unrar ya:

  • Descargar RAROSX 4.2 de rarlab.com

  • En el Finder, abra ~/Downloads y haga doble clic en el archivo descargado para descomprimirlo. A rar se creará la carpeta

  • Abra el Terminal y ejecute los siguientes comandos

    cd ~/Downloads/rar
    sudo install -d rar unrar /usr/local/bin

    para instalar los binarios (ejecutables)

  • También debemos asegurarnos de que el intérprete de comandos después encuentra los binarios

    cd ~
    echo 'PATH=$PATH:/usr/local/bin' >> .profile
    echo 'export PATH' >> .profile
    . ./.profile

1voto

Yo uso unar que es una versión de línea de comandos de The Unarchiver.

También funcionan con rutas que contienen espacios:

find . \( -name \*.rar -o -name '*.r[0-9][0-9]' \) -print0 | xargs -0 unar
find . -name '*.r[a0-9][r0-9]' -exec unar {} \+
find . -name '*.r*' -delete

O si instalar Bash 4 y añadir shopt -s globstar a ~/.bash_profile :

unar **/*.r*
shopt -s extglob; printf %s\\n **/*.@(rar|r[0-9][0-9])
rm **/*.r[a0-9][r0-9]

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X