Shell Script: Copie o primeiro arquivo de várias pastas em uma única pasta

5

Em um diretório, tenho centenas de subdiretórios. Cada subdiretório tem centenas de imagens jpg. Se a pasta for chamada "ABC_DEF", os arquivos dentro da pasta serão chamados "ABC_DEF-001.jpg", "ABC_DEF-002.jpg", e assim por diante.

Por exemplo:

---Main Directory
------Sub-Directory ABC_DEF
----------ABC_DEF-001.jpg
----------ABC_DEF-002.jpg
------Sub-Directory ABC_GHI
----------ABC_GHI-001.jpg
----------ABC_GHI-002.jpg

De cada subdiretório, desejo copiar apenas o primeiro arquivo, por exemplo, o arquivo com a extensão -001.jpg - para uma pasta de destino comum chamada DESTDIR.

Alterei o código fornecido aqui para se adequar ao meu caso de uso. No entanto, sempre imprime o primeiro diretório junto com os nomes de arquivo e não consigo copiar os arquivos para o destino desejado. O seguinte é o código:

DIR=/var/www/html/beeinfo.org/resources/videos/
find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { s/\n/,/g; p }')
    printf '%s,%s\n' "$files";
done

Como posso corrigir este código?

    
por Apricot 09.11.2017 / 10:52

3 respostas

5

Por que find quando todos os arquivos estão em diretórios da mesma profundidade?

cd "$DIR"
cp */*-001.jpg /destination/path
    
por 09.11.2017 / 13:03
4

Isso é fácil de fazer com find apenas se você escolher o primeiro arquivo que está terminando com -001.jpg padrão e apenas um em cada subdiretório, então o comando seria:

find . -name "*-001.jpg" -execdir echo cp -v {} /path/to/dest/ \;

Nota : remova o echo para execução a seco quando o resultado for o esperado.

    
por 09.11.2017 / 11:20
3

Você pode usar find -exec {} + para obter uma lista dos arquivos e chamar cp apenas uma vez:

find /path/to/main/dir -name "*-001.jpg" -exec cp -t /path/to/dest/dir/ {} +

Para testar o que ele faz primeiro, substitua cp por echo cp .

    
por 09.11.2017 / 15:58