Buscar / Anular / Eliminar guión

2

Soy un convertidor de PC, y bastante novato en lo que respecta a scripts shell / bash, pero realmente quiero aprender / entender más.

Mi necesidad: necesito poder escanear una carpeta, buscar cualquier archivo .rar, extraer los archivos en su lugar y eliminar el .rar asociado posteriormente. Cada uno también puede tener asociados los archivos .r00, .r01, ..., por lo que también deben eliminarse posteriormente.

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

    
pregunta Jason T Featheringham 25.03.2013 - 06:20

3 respuestas

3

Supongo que solo desea escanear la carpeta actual (y no todas las demás carpetas debajo de ella):

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

Lo importante es poner el nombre del archivo en "" cuando se pasa a unrar para evitar problemas con los espacios en el nombre.

Ahora, si desea tener esto como un script que puede ejecutar, puede 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. Tipo

 #!/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).

La eliminación automática 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, agregue

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

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

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

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

hace el truco también.

Si todavía no tienes rar / unrar :

  • Descargue RAROSX 4.2 de rarlab.com
  • En el Finder, abra ~/Downloads y haga doble clic en el archivo descargado para descomprimir. Se creará una carpeta rar
  • Abre la Terminal y ejecuta 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 shell encuentre los binarios

    cd ~
    echo 'PATH=$PATH:/usr/local/bin' >> .profile
    echo 'export PATH' >> .profile
    . ./.profile
    
respondido por el nohillside 25.03.2013 - 06:51
4

podrías hacer algo como esto:

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 se encuentra (el punto) canaliza 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 para eliminar (rm). La marca -f se asegura de que los archivos se eliminen instantáneamente, no se le pedirá su 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 eliminarlo, 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 este es el caso en otras distribuciones de Linux / Unix), así que asegúrate de tenerlo instalado en tu máquina.

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

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

Por lo tanto, en general, los patrones pasados a find deben incluirse en '' para producir el resultado deseado.

    
respondido por el Vincent 25.03.2013 - 06:49
1

Uso unar , que es una versión de la línea de comandos de The Unarchiver.

Estos 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 instala Bash 4 y agregue 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]
    
respondido por el user495470 26.03.2013 - 18:38

Lea otras preguntas en las etiquetas