Dentro de um determinado diretório no ambiente Linux, preciso escolher todosarquivosmodificado após uma determinada data (digamos 7 dias), bem como todosdiretórios(somente no diretório raiz, portanto não recursivamente) criado após a mesma data.
Depois disso, tenho que cuidar de 3 diretórios que exceto a última regra dada. Para estes, o processo deve ser recursivo dentro de cada um deles. Em um desses diretórios, há um arquivo que deve ser excluído de qualquer maneira.
Finalmente, tenho que adicionar todos os objetos que correspondem a esses padrões em um único arquivo .tar. É claro que cada arquivo/diretório deve manter o caminho relativo completo dentro do arquivo .tar (começando no diretório base).
Então vamos supor que temos:
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
o .tar resultante deve conter:
./normalDir2/
./exceptionDirectory2/actions2/power2.sh
./exceptionDirectory2/events2/deploy2.php
./file_to_be_updated.php
Eu criei 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
mas parece não funcionar corretamente, pois é encerrado quase imediatamente com este erro:
tar: ./img: Impossibile open: Is a directory
Observe que "require", "img" e "plugin" são os três diretórios especiais a serem tratados recursivamente. O que há de errado com o roteiro? Obrigado pela sua ajuda.
Responder1
O que está causando o erro é que você tem espaços ou outros caracteres especiais nos nomes dos arquivos em ./img
.
Em vez de usar a -print
opção para find
, use -print0
a -0
opção correspondente para `xargs':
find ./img ! -path ./img -mtime -7 -print0 | xargs -0 tar uvf `date --rfc-3339=date`-package.tar
Responder2
- Em vez de
find ./foo ! -path ./foo
você poder usarfind -mindepth 1 ./foo
. Isso garante que apenas os arquivosdentroos caminhos especificados são impressos. Se você possui GNU,
tar
pode usar--exclude=PATTERN
. Dessa forma, você poderá escrever algo assim: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
Responder3
Eu escrevo na hora, tento se funciona alguma coisa
tar cvf --no-recursion --after-date $yourdate $TarFile * */*
tar uvrf --after-date $yourdate $TarFile ./require ./plugin ./img