Script para mover um tipo de arquivo e criar uma subpasta, se existir?

1

Eu estou tentando encontrar um script que basicamente olharia de forma negativa em um diretório, e se o script encontrar arquivos que são .flac files, ele criará uma subpasta chamada FLAC na mesma pasta e moverá o .flac de arquivos apenas nesse diretório. Pode encontrar 30 arquivos flac no mesmo diretório, então eu não quero que ele funda quando perceber que a pasta já existe, etc ...

Exemplo de layout de pasta / arquivo:

  • O caminho base é

    /files/music
    
  • Atualmente, os subdiretórios parecem

    /files/music/artist
    /files/music/artist/album1
    /files/music/artist/album2
    
  • Os arquivos aparecem como

    /files/music/artist/album1/01-song 1.mp3
    /files/music/artist/album1/01-song 1.flac
    /files/music/artist/album1/02-another song.mp3
    /files/music/artist/album1/02-another song.flac
    /files/music/artist/album2/01-yet another.mp3
    /files/music/artist/album2/01-yet another.flac
    
  • Então, basicamente eu quero que isso se torne:

    /files/music/artist/album1/01-song1.mp3
    /files/music/artist/album1/02-another song.mp3
    /files/music/artist/album1/flac/01-song 1.flac
    /files/music/artist/album1/flac/02-another song.flac
    /files/music/artist/album2/01-yet another.mp3
    /files/music/artist/album2/flac/01-yet another.flac
    

A idéia é que depois de escanear vários CDs, eu tenho muitas pastas com versões mistas ... então os media players acabam tocando a música duas vezes (primeiro a versão mp3, depois a versão flac ) ...

É possível escrever algo que deixaria o diretório como está, se não existirem arquivos mp3? (apenas flac?) Assim, se uma pasta tivesse apenas arquivos .flac, ela não criaria uma subpasta ... deixe-a como está. O único soluço que eu veria seria que ele teria que procurar por arquivos mp3, pois pode haver outros arquivos nas pastas (arquivos de capa jpg, etc.)

    
por DayOff 30.05.2015 / 19:23

3 respostas

2

Uma versão fácil que sempre cria subdiretórios flac e mp3 (a menos que eles estivessem vazios), usando o comando find para executar um script para criar um subdiretório se necessário e mover o arquivo para lá:

find . -name '*.mp3' -o -name '*.flac' -exec sh -c 'mkdir -p "${0%/*}/${0##*.}" && mv "$0" "${0%/*}/${0##*.}"' {} \;

Para cada arquivo para o qual o fragmento de shell é executado, $0 é o caminho para o arquivo, ${0%/*} é a parte do diretório e ${0##*.} é a extensão.

Como alternativa, no bash (ou ksh93 com set -o globstar em vez de shopt -s globstar extglob , ou em zsh sem setopt ksh_glob ), usando o ** pattern :

shopt -s globstar extglob
for x in **/*.@(mp3|flac); do
  mkdir -p "${x%/*}/${x##*.}" && mv "$x" "${x%/*}/${x##*.}"
done

Agora vamos criar uma versão que não crie um subdiretório se todos os arquivos tiverem a mesma extensão. Aqui é mais fácil recorrer aos diretórios. Isto é para o bash (pode ser adaptado para ksh93 ou zsh). Em cada diretório, o script coleta a lista de todos os arquivos (excluindo o subdiretório . e ..), all .flac files and all .mp3 files in arrays. If there is at least one flac file and at least one non-flac files, move the flac files to a flac '. Idem para arquivos mp3.

shopt -s globstar nullglob; GLOBIGNORE=.:..
start_wd=$PWD
for dir in "$PWD"/**/*/; do
  cd "$dir"
  files=(*)
  flac_files=(*.flac)
  mp3_files=(*.mp3)
  if ((${#flac_files[@]} > 0 && ${#flac_files[@]} < ${#files[@]})); then
    mkdir flac && mv "${flac_files[@]}" flac/
  fi
  if ((${#mp3_files[@]} > 0 && ${#mp3_files[@]} < ${#files[@]})); then
    mkdir mp3 && mv "${mp3_files[@]}" mp3/
  fi
done
cd "$start_wd"
    
por 31.05.2015 / 02:02
2

Use isto:

#!/bin/bash

find /files/music/artist -type f -name '*.flac' | while IFS= read -r file; do
    dir="$(dirname "$file")"
    file="$(basename "$file")"
    shopt -s nullglob
    mp3s=( "$dir"/*.mp3 )

    if ! [[ ${#mp3s[@]} -eq 0 ]]; then
        ext="${file##*.}"
        mkdir -p "$dir/$ext" && mv -i "$dir/$file" "$dir/$ext"
    fi
done
  • find encontrará arquivos com a extensão .flac no diretório mencionado e em todos os seus subdiretórios.

  • dir conterá os nomes de diretório dos arquivos e file terá o nome do arquivo

  • Em seguida, verificamos se esse diretório tem qualquer arquivo .mp3 , senão os arquivos permanecerão como estão no diretório

  • Se houver qualquer arquivo .mp3 nesse diretório, um diretório com o nome da extensão ( flac ) será criado e os arquivos .flac serão movidos para esse diretório.

por 30.05.2015 / 21:16
0

Você tem requisitos um pouco complicados, mas esse script pode ajudar.

#!/bin/bash

run() {
        if $DRYRUN; then
                echo -n +
                printf " '%s'" "$@"
                echo
        else
                "$@"
        fi
}

DRYRUN=false
if test x"$1" = x-d; then
        DRYRUN=true
        shift
fi

for dir in "$@"; do 
        find "$dir" -type d |
        while read subdir; do
                if ls "$subdir"/*.flac >/dev/null 2>&1; then
                        if ls "$subdir"/*.mp3 >/dev/null 2>&1; then
                                run mkdir -p "$subdir"/flac
                                run mv "$subdir"/*.flac "$subdir"/flac
                        fi
                fi
        done
done

Você pode ver o que está acontecendo especificando -d . Certifique-se de verificar novamente antes de movimentos reais.

$ ./script.sh -d /files/music
+ 'mkdir' '-p' '/files/music/artist/album2/flac'
+ 'mv' '/files/music/artist/album2/01-yet another.flac' '/files/music/artist/album2/flac'
+ 'mkdir' '-p' '/files/music/artist/album1/flac'
+ 'mv' '/files/music/artist/album1/01-song 1.flac' '/files/music/artist/album1/02-another song.flac' '/files/music/artist/album1/flac'
    
por 30.05.2015 / 20:13