Copie arquivos com determinada extensão de muitos subdiretórios aninhados para um único diretório e anexe a cada arquivo copiado o nome do diretório

0

Eu tenho um diretório pai com milhares de diretórios dentro de subdiretórios e assim por diante. Em some dos subdiretórios eu tenho poucos arquivos de imagem.

Eu quero copiar ( rsync é o preferido) todos os arquivos bmp e jpg dos subdiretórios para um único novo diretório sem nenhum subdiretório. Mas, ao mesmo tempo, quero anexar o nome do diretório LAST do qual o arquivo vem para o arquivo copiado.

├── example1
│   ├── fdfd
│   │   ├── db_files
│   │   │   ├── asdasd.zip
│   │   │   ├── dfdfsta.zip
│   │   │   ├── csf_4545.zip
│   │   │   ├── 45455.zip
│   │   │   ├── 4544.zip
│   │   │   ├── 45545.zip
│   │   │   ├── gfdfgd.zip
│   │   │   ├── retert.zip
│   │   │   ├── vcxvxc.zip
│   │   │   ├── vcxcvcx.zip
│   │   │   ├── asdr3.zip
│   │   │   ├── tetst.zip
│   │   │   ├── testeh.bmp
│   │   │   └── testst43.zip
│   │   ├── TEST_FILE.bmp
│   │   └── hfexport.csv
│   └── testFOLDER2018-05
│       ├── Databasef.txt
│       ├── Folder_Backup_2014-01-05.7z
│       ├── full_Export.pdf
│       ├── f-to-7000.csv
│       ├── f-to-505.csv
│       ├── f-to-600.csv
│       ├── f-to-960.bmp
│       ├── g-to-1000.jpg
│       └── 7000.csv
├── example3
│   ├── img_copy
│   │   ├── automation
│   │   │   ├── f.sh
│   │   │   ├── fff.sh
│   │   │   └── test.bat
│   │   ├── all.bmp
│   │   ├── h23.txt
│   │   ├── old2_copy.jpg

No exemplo acima, os arquivos copiados serão os seguintes:

db_files_testeh.bmp
fdfd_TEST_FILE.bmp
testFOLDER2018-05_f-to-960.bmp
testFOLDER2018-05_g-to-1000.jpg
img_copy_all.bmp
img_copy_old2_copy.jpg

Como posso conseguir isso?

Eu uso os seguintes comandos para copiar apenas os arquivos bmp e jpg para um novo diretório.

find -regex '.*\.\(bmp\|jpg\)' | tee /home/tmp/matches.txt
while read -r LINE; do rsync -vh --append-verify --chmod=ugo=rwX --progress --stats "$LINE" /mnt/storage3/backups/NEW_DIR/ONLY_IMAGES; done < /home/tmp/matches.txt
    
por zirodec 01.08.2018 / 14:16

1 resposta

0
find . -type f '(' -name '*.bmp' -o -name '*.jpg' ')' -exec sh -c '
    for pathname do
        newname="${pathname%/*}_${pathname##*/}"  # a/b/c/d.bmp --> a/b/c_d.bmp
        newname="target/${newname##*/}"           # a/b/c_d.bmp --> target/c_d.bmp

        printf "Would move %s to %s\n" "$pathname" "$newname"
        # mv -i "$pathname" "$newname"
    done' sh {} +

Isso localiza todos os arquivos regulares cujos nomes de arquivos terminam com .jpg ou .bmp . Para lotes desses arquivos, um pequeno script de shell é executado.

O shell script extrai o nome do caminho do diretório de cada arquivo, junto com seu nome de arquivo e concatena os dois com um sublinhado no meio. Isso forma o novo nome. O novo nome é cortado de seus diretórios iniciais, deixando apenas o nome do arquivo e um caminho de diretório de destino é anexado a ele.

O% finalmv é comentado por segurança. Execute esta vez com ele comentou para ver que ele faz a coisa certa.

Relacionados:

por 01.08.2018 / 14:35