Dentro de un directorio determinado en el entorno Linux, necesito seleccionar todosarchivosmodificado después de una fecha determinada (digamos 7 días), así como todosdirectorios(solo en el directorio raíz, por lo tanto no recursivo) creado después de la misma fecha.
Después de eso, tengo que ocuparme de 3 directorios que exceptúan la última regla dada. Para estos el proceso tiene que ser recursivo dentro de cada uno de ellos. En uno de estos directorios, hay un archivo que debe excluirse pase lo que pase.
Finalmente, tengo que agregar todos los objetos que coincidan con estos patrones a un único archivo .tar. Por supuesto, cada archivo/directorio debe mantener la ruta relativa completa dentro del archivo .tar (comenzando desde el directorio base).
Entonces supongamos que tenemos:
myHome
|-- normalDir1 // older than 7 days
| |-- blah.txt
| |-- to_be_excluded_nmw.txt // should never be included anyways
| `-- poems.txt
|-- normalDir2 // created yesterday
| |-- blah2.txt /*
| |-- whatever2.txt * Since it's a normal directory,
| |-- whatever3.txt * I want to exclude these files from .tar
| `-- poems2.txt */
|-- exceptionDirectory1 // older than 7 days
| |-- actions // older than 7 days
| | `-- power.sh // older than 7 days
| `-- events // older than 7 days
| |-- deploy.php // older than 7 days
| `-- set.php // older than 7 days
|-- exceptionDirectory2 // older than 7 days
| |-- actions2
| | `-- power2.sh // created yesterday
| `-- events2 // older than 7 days
| |-- deploy2.php // created yesterday
| `-- set2.php // older than 7 days
|-- file_to_be_updated.php // created yesterday
`-- file_NOT_to_be_updated.php // older than 7 days
el .tar resultante debe contener:
./normalDir2/
./exceptionDirectory2/actions2/power2.sh
./exceptionDirectory2/events2/deploy2.php
./file_to_be_updated.php
He creado este script:
#!/bin/bash
TODAY=`date --rfc-3339=date`
FILENAME=$TODAY-package.tar
find ./require ! -name db_connection.php ! -path ./require -mtime -7 -print | xargs tar cvf `date --rfc-3339=date`-package.tar
find ./img ! -path ./img -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar
find ./plugin ! -path ./plugin -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar
find . -maxdepth 1 ! -name $TODAY-package.tar.gz ! -path . -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar
pero no parece funcionar correctamente ya que se cierra casi inmediatamente con este error:
tar: ./img: Impossibile open: Is a directory
Observe que "require", "img" y "plugin" son los tres directorios especiales que se tratarán de forma recursiva. ¿Qué pasa con el guión? Gracias por su asistencia.
Respuesta1
Lo que está causando el error es que tiene espacios u otros caracteres especiales en los nombres de archivo bajo ./img
.
En lugar de usar la -print
opción to find
, use -print0
y la -0
opción correspondiente a `xargs':
find ./img ! -path ./img -mtime -7 -print0 | xargs -0 tar uvf `date --rfc-3339=date`-package.tar
Respuesta2
- En lugar de que
find ./foo ! -path ./foo
puedas usarfind -mindepth 1 ./foo
. Esto garantiza que sólo los archivosadentrose imprimen las rutas especificadas. Si tienes GNU
tar
puedes usar--exclude=PATTERN
. De esa manera deberías poder escribir algo como esto:today="$(date --rfc-3339="date")" last_week="$(date --rfc-3339="date" --date="-7 days")" tar --no-recursion --exclude=db_connection.php --after-date="$last_week" cvf "${today}-package.tar" . tar --after-date="$last_week" uvf "${today}-package.tar" ./require ./img ./plugin
Respuesta3
Lo escribo sobre la marcha, intento si funciona de alguna manera.
tar cvf --no-recursion --after-date $yourdate $TarFile * */*
tar uvrf --after-date $yourdate $TarFile ./require ./plugin ./img