LINUX.ORG.RU

Переместить файлы старше N дней с сохранением структуры каталогов

 ,


0

2

Всем доброго времени суток.

Скостылил скрипт на PowerShell, который перемещает файлы старше N дней, а затем подчищает за собой пустые каталоги. Если они есть.

Скрипт:

$TargetFolder = "/path/to"
$DestinationFolder = "/path/to1"
$Period= "-6"

$CurrentMonths = Get-Date
$ChMonthsCp = $CurrentMonths.AddMonths($Period)

Get-ChildItem $TargetFolder -Recurse | Where { $_.LastAccessTime -le $CurrentMonths -and !$_.PsIsContainer } | Move-Item -Destination { md $_.DirectoryName.Replace("$TargetFolder","$DestinationFolder") -Force }

do {
    $dirs = Get-ChildItem $TargetFolder -Recurse | Where { $_.PsIsContainer -and (Get-ChildItem $_.FullName -Force -Recurse) -eq $null }
    $dirs | Remove-Item
} while ($dirs.count -gt 0)

Но, в конце получаю ошибку в последний проход цикла, что Path у меня NULL. Это в принципе логично.

Ошибка:

Remove-Item : Не удается привязать аргумента к параметру "Path", так как он имеет значение NULL.
строка:4 знак:24
+     $dirs | Remove-Item <<<< 
    + CategoryInfo          : InvalidData: (:) [Remove-Item], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.RemoveItemCommand

При этом скрипт отрабатывает нормально, подчищает то, что нужно и всё вроде бы хорошо. Но, подскажите, как можно избавиться от ошибки?



Последнее исправление: hanharr (всего исправлений: 2)

"для почина"

вставить проверку что $dirs не null перед строкой, в которой возникает ошибка?

anymouze ★★
()

offtopic:

do {} while ($dirs.count -gt 0)

Если сначала(до проверки на пустоту) отсортировать список каталогов в порядке уменьшения [длинны] имени, можно обойтись одним обходом каталогов, что быстрее, красивше, и null-ов не должно быть.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Интересная мысль, спасибо попробую.

hanharr
() автор топика
Ответ на: комментарий от DonkeyHot

В общем, скостылил такую штуку. По ощущениям работает не быстрее, а насчет красоты мне пока трудно судить. После bash чет не могу въехать в то, как оформлять код.

$dir = Get-ChildItem $TargetFolder -Recurse | 
        Where-Object { $_.PsIsContainer -eq "true" } | 
            Select-Object FullName, @{ Name="NameLength"; Expression={$_.FullName.Length}} | 
                Sort-Object NameLength -Descending

$isEmpty = $dir | Where { (Get-ChildItem $_.FullName -Force -Recurse) -eq $null } | Select-Object -ExpandProperty FullName
$isEmpty | ForEach-Object { Remove-Item $_ }
hanharr
() автор топика
Ответ на: комментарий от hanharr
-bash: Select-Object: command not found
-bash: Where-Object: command not found
-bash: =: command not found
-bash: Sort-Object: command not found



Ниработает!

slowpony ★★★★★
()
find . -ctime +3 -exec cp --parents {} ~/dest/ \;

Потом прогоняешь тот же файнд и удаляешь файлы старше N дней.

powershell

Говно из жопы.

entefeed ☆☆☆
()
Ответ на: комментарий от entefeed

Если бы я мог использовать bash, то вопросов бы не возникло. Мне надо переместить в ВИНДОВОЙ (:() шаре файлы старше 6 месяцев с сохранением структуры каталогов. Приходится открывать новое для себя. Надо браться за Python, чтобы иметь что-то универсальное в арсенале.

hanharr
() автор топика
Ответ на: комментарий от hanharr

ты поосторожнее, тут неадекватов хватает, которые и на python с ещё большей яростью набросятся.

grem ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.