Estoy tratando de escribir un script de bash que haga lo siguiente:
- Enumera a través de la lista de archivos en un directorio, que coinciden con un patrón específico
- Crea un archivo tar que contiene los archivos coincidentes.
- 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:
- Cómo globar los archivos que coinciden con el patrón $ f
- 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 № 1tar(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.