mover arquivos de determinados formatos de subdiretórios para diretórios com os mesmos nomes de pastas

1

Eu tenho uma situação estranha. Eu tenho 100s de pastas com cópias flac e mp3 das mesmas faixas. Eu preciso separar os mp3s dos flacs e colocá-los em diretórios com nomes semelhantes.

por exemplo:

Album A : flac+mp3 >> Album A : flac
                      Album A : mp3

Eu estou em um sistema Unix. Como posso usar a linha de comando para conseguir isso?

    
por john 17.03.2014 / 01:52

2 respostas

3

Este pequeno scriptlet fará o que você quiser. Execute-o no diretório que contém sua música (você pode copiar / colar diretamente no terminal e teclar Enter ):

## Find all subdirectories of the current directory and 
## iterate through them, saving their name in the $d variable.
## There are various tricks used here to deal with spaces and
## weird characters in file names. See http://mywiki.wooledge.org/BashFAQ/020
find . -type d -print0 | while IFS= read -r -d '' dir; do

    ## Create the $dir/mp3 and $dir/flac directories
    ## unless they exist
    mkdir -p "$dir"/{mp3,flac}

    ## Move all mp4 files to $dir/mp3
    mv "$dir"/*.mp3 "$dir"/mp3 2>/dev/null

    ## Move all flac files to $dir/flac
    mv "$dir"/*.flac "$dir"/flac 2>/dev/null

    ## The previous steps will also create an artist/mp3 and 
    ## artist/flac directories, and if there were no files in
    ## the artist directory (only in the albums) these will be empty.
    ## This deletes them safely since rmdir will only remove empty ones.
  rmdir "$dir"/{flac,mp3} 2>/dev/null
done

O comando acima irá transformar isso:

├── artist1
│   ├── album1
│   │   ├── file1.flac
│   │   ├── file1.mp3
│   │   ├── file2.flac
│   │   └── file2.mp3
│   └── album2
│       ├── file1.flac
│       ├── file1.mp3
│       ├── file2.flac
│       └── file2.mp3
└── artist2
    ├── album1
    │   ├── file1.flac
    │   ├── file1.mp3
    │   ├── file2.flac
    │   └── file2.mp3
    └── album2
        ├── file1.flac
        ├── file1.mp3
        ├── file2.flac
        └── file2.mp3

para isso:

├── artist1
│   ├── album1
│   │   ├── flac
│   │   │   ├── file1.flac
│   │   │   └── file2.flac
│   │   └── mp3
│   │       ├── file1.mp3
│   │       └── file2.mp3
│   └── album2
│       ├── flac
│       │   ├── file1.flac
│       │   └── file2.flac
│       └── mp3
│           ├── file1.mp3
│           └── file2.mp3
└── artist2
    ├── album1
    │   ├── flac
    │   │   ├── file1.flac
    │   │   └── file2.flac
    │   └── mp3
    │       ├── file1.mp3
    │       └── file2.mp3
    └── album2
        ├── flac
        │   ├── file1.flac
        │   └── file2.flac
        └── mp3
            ├── file1.mp3
            └── file2.mp3
    
por 17.03.2014 / 04:03
2

Você pode fazer isso com find , mkdir e mv . Primeiro você cria os diretórios necessários:

cd /target/dir/mp3
# the next line produces output which explains what's happening
find /source/dir -mindepth 1 -type d -printf "%P
cd /target/dir/flac
find /source/dir -mindepth 1 -type d -printf "%P
find /source/dir -mindepth 1 -type d -printf "%P
cd /source/dir
find . -mindepth 1 -type d -exec bash -c 'echo mv -t "/target/dir/mp3/{}" "{}"/*.mp3' \;
" | xargs -0 -n 1 bash -c \ 'cd /source/dir/"$1"; echo mv -t "/target/dir/mp3/$1" *.mp3' bash-mv
" | xargs -0 mkdir
" | xargs -0 echo mkdir find /source/dir -mindepth 1 -type d -printf "%P
cd /target/dir/mp3
# the next line produces output which explains what's happening
find /source/dir -mindepth 1 -type d -printf "%P
cd /target/dir/flac
find /source/dir -mindepth 1 -type d -printf "%P
find /source/dir -mindepth 1 -type d -printf "%P
cd /source/dir
find . -mindepth 1 -type d -exec bash -c 'echo mv -t "/target/dir/mp3/{}" "{}"/*.mp3' \;
" | xargs -0 -n 1 bash -c \ 'cd /source/dir/"$1"; echo mv -t "/target/dir/mp3/$1" *.mp3' bash-mv
" | xargs -0 mkdir
" | xargs -0 echo mkdir find /source/dir -mindepth 1 -type d -printf "%P%pre%" | xargs -0 mkdir
" | xargs -0 mkdir

Cada diretório sob a raiz de origem é criado sob a raiz de destino. E, novamente, para o outro grupo de arquivos:

%pre%

Verifique se isso faz o que você deseja:

%pre%

Devido a echo , não é perigoso, mas mostra o que aconteceria (se o echo for excluído): Para cada diretório sob a raiz de origem, o diretório atual é alterado para ele e mv é chamado para todos os arquivos do respectivo tipo nesse diretório. A complicada estrutura -printf | xargs bash -c se deve ao fato de que ... eu não percebi antes que é mais fácil:

%pre%

O shell ainda é necessário para a expansão *.mp3 .

    
por 17.03.2014 / 04:40