/ / Bash shell script a los archivos glob en varios directorios, agregue a un archivo y elimine el archivo original - bash

Bash shell script para englobar archivos en varios directorios, agregar a un archivo y eliminar el archivo original - bash

Estoy tratando de escribir un script de bash que haga lo siguiente:

  1. Enumera a través de la lista de archivos en un directorio, que coinciden con un patrón específico
  2. Crea un archivo tar que contiene los archivos coincidentes.
  3. Elimina (es decir, elimina) los archivos coincidentes de sus directorios de origen

Para simplificar las cosas, pretendo usar una lista de directorios y patrones de archivos codificados

Esto es lo que he encontrado hasta ahora:

#!/bin/bash

filenames[0]="/home/user1/*.foo"
filenames[1]="/some/otherpath/*.fbar"

for f in ${filenames[@]}
do
echo "$f"
done

Sin embargo, no estoy seguro de cómo proceder desde este punto en adelante. Específicamente, necesito ayuda en:

  1. Cómo globar los archivos que coinciden con el patrón $ f
  2. Cómo agregar la lista completa de archivos coincidentes (es decir, de todos los directorios) a un archivo tar de una sola vez

Con respecto a la eliminación de los archivos, estoy pensando en simplemente iterar a través de la lista COMPLETA obtenida en el paso 2 anterior, y "rm" el archivo real. ¿Existe una forma mejor / más rápida / más elegante?

PD:

Estoy ejecutando esto en Ubuntu 10.0.4 LTS

Respuestas

0 para la respuesta № 1

tar(1) apoya un --remove-files Opción que eliminará los archivos después de agregarlos al archivo.

Dependiendo de lo que estés tratando de hacer con tus globos de shell, puedes ignorar hacer todo ese trabajo adicional allí también. Prueba esto:

tar cf /dir/archive.tar --remove-files /home/user1/*.foo /some/otherpath/*.fbar

0 para la respuesta № 2

Si desea usar un bucle porque tiene muchos directorios, puede usar el -r Opción de añadir al archivo tar. También puedes usar --remove-files para eliminar archivos después de agregarlos al archivo.

filenames[0]="/home/user1/*.foo"
filenames[1]="/some/otherpath/*.fbar"

for f in "${filenames[@]}"
do
tar -rvf --remove-files foo.tar $f
done

Si no tienes el --remove-files opción, usar rm $f después de la tar mando.