Buscar / Descomprimir / Eliminar secuencia de comandos

2

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

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

¿Alguien puede ayudarme a descubrir (y entender) cómo escribir un guión para esto? Cuantos más comentarios, mejor.

Jason T Featheringham
fuente
1
Cosas para leer: files.fosswire.com/2007/08/fwunixref.pdf , digilife.be/quickreferences/QRC/… , cualquier introducción de bash que pueda encontrar y páginas de manual para todos los comandos que encuentre
nohillside
Tenga en cuenta que programas como unarchiver, la aplicación descomprimirá y eliminará todos los archivos cuando haga doble clic en uno de ellos en Finder
Mark

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

La clave es poner el nombre del archivo en "" al pasarlo unrarpara evitar problemas con 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 brinda un editor simple para archivos de texto, los comandos esenciales se muestran en la parte inferior. Tipo

 #!/bin/bash

seguido por el bloque de código en la parte superior, guarde el archivo y salga. Luego (en el shell nuevamente) 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: unrarno devuelve un estado de error si las cosas salen 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 unraren el bucle anterior hará el trabajo. El segundo parámetro se usa para crear todos los .r04sufijos 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 archivo no existen, he agregado -funa opción para evitar mensajes de error.

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

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

hace el truco también.


Si no tienes rar/ unrarya:

  • Descargar RAROSX 4.2 de rarlab.com
  • En Finder, abra ~/Downloadsy haga doble clic en el archivo descargado para descomprimir. Se rarcreará una carpeta.
  • Abra la Terminal y ejecute los siguientes comandos

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

    instalar los binarios (ejecutables)

  • También debemos asegurarnos de que el shell luego encuentre los binarios

    cd ~
    echo 'PATH=$PATH:/usr/local/bin' >> .profile
    echo 'export PATH' >> .profile
    . ./.profile
nohillside
fuente
1
Gracias. Sí, estoy dispuesto a renunciar al riesgo de eliminación accidental si el rar está corrupto. Probablemente podría simplemente canalizar los nombres de archivo en un inicio de sesión como un caso de auditoría, algo sale mal. Muy conciso y bien escrito. Muy apreciado. ¡Estoy aprendiendo mucho de esto!
Jason T Featheringham el
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 archivos rar de forma recursiva 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 bandera -f asegura que los archivos se eliminen instantáneamente, no se le pedirá su permiso. El rm -f es un comando poderoso que debes usar con cuidado, así que piensa en lo que eliminaría si lo ejecutaras antes de eliminarlo, o simplemente prueba 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úrese de tenerlo instalado en su máquina.


Nota: Hay una diferencia importante entre bien, pero find . -iname *.r*y find . -iname '*.r*'en relación con la forma en cáscaras de Unix manejan comodines:

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

Entonces, en general, los patrones pasados finddeben incluirse ''para producir el resultado deseado.

Vincent
fuente
1
Desearía poder aceptar ambas respuestas. Esto ayuda tremendamente!
Jason T Featheringham el
1

Yo uso unar , que es una versión de 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 agrega shopt -s globstara ~/.bash_profile:

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