В заданном каталоге в среде Linux мне нужно выбрать всефайлыизмененные после определенной даты (скажем, 7 дней), а также всекаталоги(только в корневом каталоге, следовательно, нерекурсивно) создано после той же даты.
После этого мне нужно позаботиться о 3 каталогах, которые исключают последнее данное правило. Для них процесс должен быть рекурсивным внутри каждого из них. В одном из этих каталогов есть файл, который нужно исключить в любом случае.
Наконец, мне нужно добавить все объекты, соответствующие этим шаблонам, в один архив .tar. Каждый файл/каталог, конечно, должен содержать полный относительный путь в файле .tar (начиная с базового каталога).
Итак, предположим, что у нас есть:
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
Полученный .tar должен содержать:
./normalDir2/
./exceptionDirectory2/actions2/power2.sh
./exceptionDirectory2/events2/deploy2.php
./file_to_be_updated.php
Я создал этот скрипт:
#!/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
но, похоже, он работает неправильно, поскольку почти сразу завершает работу с этой ошибкой:
tar: ./img: Impossibile open: Is a directory
Обратите внимание, что "require", "img" и "plugin" — это три специальных каталога, которые следует обрабатывать рекурсивно. Что не так со скриптом? Спасибо за помощь.
решение1
Причиной ошибки является наличие пробелов или других специальных символов в именах файлов в разделе ./img
.
Вместо использования -print
параметра to find
используйте -print0
и соответствующий -0
параметр `xargs':
find ./img ! -path ./img -mtime -7 -print0 | xargs -0 tar uvf `date --rfc-3339=date`-package.tar
решение2
- Вместо того, чтобы
find ./foo ! -path ./foo
вы могли использоватьfind -mindepth 1 ./foo
. Это гарантирует, что только файлывнутриуказанные пути будут напечатаны. Если у вас есть GNU,
tar
вы можете использовать--exclude=PATTERN
. Таким образом, вы сможете написать что-то вроде этого: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
решение3
Я пишу это на ходу, пробую, работает ли что-то вокруг
tar cvf --no-recursion --after-date $yourdate $TarFile * */*
tar uvrf --after-date $yourdate $TarFile ./require ./plugin ./img