pesquisa e remoção de arquivos condicionais

1

Eu tenho alguns itens que têm 15 imagens e alguns que têm menos de 15 imagens associadas aos seus IDs. Como posso manter apenas os que têm 15 imagens com eles?

$ ls -l 72065050* | wc -l
15
$ ls -l 71088714* | wc -l
3

e

$ ls 71088714*
71088714_0.jpg  71088714_1.jpg  71088714_2.jpg
$ ls 72065050*
72065050_0.jpg   72065050_11.jpg  72065050_13.jpg  72065050_1.jpg  72065050_3.jpg  72065050_5.jpg  72065050_7.jpg  72065050_9.jpg
72065050_10.jpg  72065050_12.jpg  72065050_14.jpg  72065050_2.jpg  72065050_4.jpg  72065050_6.jpg  72065050_8.jpg

Além disso, como posso descobrir quantos desses IDs têm 15 imagens associadas a eles?

    
por Mona Jalal 20.11.2017 / 20:13

4 respostas

3

Não testado, mas você pode fazer algo como:

printf "%s\n" *.jpg | cut -d_ -f1 | sort -u | while IFS= read -r prefix; do
    files=( "$prefix"*.jpg )
    if [[ "${#files[@]}" -ne 15 ]]; then
        echo rm "$prefix"*
    fi
done

Ele encontra a lista de prefixos exclusivos e, para cada um, coloca a lista de arquivos em uma matriz: se o tamanho da matriz não for 15, remova.

    
por glenn jackman 20.11.2017 / 20:39
1
#!/bin/bash
find . -maxdepth 1 -iname '*.jpg' |\
while IFS='' read -r bla; do
  if ! ls "${bla:0:7}"_14.jpg >/dev/null 2>&1; then
    echo rm "${bla:0:7}"*
  fi
done
    
por Mona Jalal 20.11.2017 / 20:34
0

Outra resposta possível é:

$ declare -A pref ; for f in *_[0-9]*.jpg ; do p=${f%_*} ; (( pref[$p]++ )); done ; for p in "${!pref[@]}" ; do (( ${pref[$p]} < 15 )) &&  rm "$p"_* ; done
    
por Mona Jalal 21.11.2017 / 01:20
0

Você também pode usar uma linguagem sem shell para essa tarefa:

ruby -e '
  files = Dir.glob("*")
  groups = files.group_by {|f| f.sub(/_.*/, "")}
  groups.each_value {|flist| File.delete(*flist) if flist.length < 15}
'

ou

perl -e '
    foreach $f (glob "*") {
        ($prefix = $f) =~ s/_.*//;
        push @{$groups{$prefix}}, $f;
    }
    foreach $flist (values %groups) {
        unlink @$flist if (scalar @$flist < 15);
    }
'
    
por glenn jackman 21.11.2017 / 16:06