Por que o 'find' não exclui os arquivos encontrados?

2

Estou tentando entender por que o comando find não está excluindo arquivos em um caso específico. Eu tenho o seguinte comando:

find C:\path\to\Pictures\pmcctv -name cap_*.jpg
-o -name cap_*.ogg -o -name cap_*.flv -o -name cap_*.mp4 -o -name cap_*.webm -mtime +7

Que retorna os arquivos que eu esperaria:

C:\path\to/Pictures/pmcctv/cap_20160915T193251_620067800.jpg
C:\path\to/Pictures/pmcctv/cap_20160915T193322_742708800.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T081046_394767500.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T081125_615129600.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T081129_503678200.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T081255_842394600.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161008_693586800.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161012_749396800.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161043_774132200.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161150_497251900.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161154_437379600.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161337_350955300.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161341_452596000.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161412_870774000.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161443_969064400.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161554_468109900.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161558_378086000.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161916_668433100.jpg

Agora, se eu tentar executar o mesmo comando com -delete , os arquivos não serão excluídos:

find C:\path\to\Pictures\pmcctv -name cap_*.jpg -o -name cap_*.ogg
-o -name cap_*.flv -o -name cap_*.mp4 -o -name cap_*.webm -mtime +7 -delete

Eu também tentei com -exec rm , mas eles também não foram excluídos:

find C:\path\to\Pictures\pmcctv -name cap_*.jpg -o -name cap_*.ogg
-o -name cap_*.flv -o -name cap_*.mp4 -o -name cap_*.webm -mtime +7 -exec rm {} \;

find não retorna nenhum erro e os arquivos são de minha propriedade com permissões 644.

Alguma ideia do que poderia estar causando isso?

(nota: eu cortei os comandos para torná-lo mais legível, mas normalmente não há quebra de linha)

    
por this.lau_ 18.09.2016 / 16:46

1 resposta

6

A justaposição se liga mais strongmente do que o operador -o . Então seu comando é equivalente a

find C:\path\to\Pictures\pmcctv \( -name cap_*.jpg \) -o \
                                    \( -name cap_*.ogg \) -o \
                                    \( -name cap_*.flv \) -o \
                                    \( -name cap_*.mp4 \) -o \
                                    \( -name cap_*.webm -mtime +7 -delete \)

e apenas arquivos de uma semana que correspondem a cap_*.webm são excluídos.

Além disso, se houver algum arquivo correspondente a um dos padrões no diretório atual, esse padrão será substituído pela lista de arquivos correspondentes. Se o padrão corresponder exatamente a um arquivo no diretório atual, somente os arquivos com o mesmo nome serão correspondidos nos subdiretórios; se corresponder a dois ou mais arquivos, você receberá um erro de sintaxe.

O comando que você está procurando é

find C:\path\to\Pictures\pmcctv \
     \( -name 'cap_*.jpg' -o -name 'cap_*.ogg' -o -name 'cap_*.flv' -o -name 'cap_*.mp4' -o -name 'cap_*.webm' \) \
     -mtime +7 -delete

Você pode abreviá-lo para

find C:\path\to\Pictures\pmcctv \
     -regex '.*/cap_[^/]*\.\(jpg\|ogg\|flv\|mp4\|webm\)' \
     -mtime +7 -delete

Ou você pode usar o zsh e, em particular, seu qualificador m para arquivos de correspondência por hora de modificação.

rm C:\path\to\Pictures\pmcctv/**/cap_*.(jpg|ogg|flv|mp4|webm)(md+7)
    
por 19.09.2016 / 00:25