Como mover apenas arquivos com outro nome de arquivo igual mas extensão diferente na pasta

1

Eu tenho muitas pastas, algumas com apenas arquivos mp3, outras com apenas arquivos m4a, outras com arquivos de ambas as extensões.

Eu preciso identificar quais pastas têm arquivos em ambas as extensões, então movo os arquivos mp3 para outra pasta, mantendo apenas os arquivos m4a. Se a pasta tiver algum arquivo que não esteja nas duas extensões, nada deverá acontecer.

Estou explorando o shell há algum tempo, mas não estou nem perto de fazer algo assim. Se eu tiver algum progresso, atualizarei aqui mesmo assim.

    
por NoneType 31.01.2014 / 00:10

4 respostas

2

Se eu entendi isso corretamente, você só precisa procurar .mp3 arquivos e mover aqueles para os quais existe um arquivo .m4a equivalente no mesmo diretório. O script bash a seguir fará isso, mas não encontrará pares duplicados de arquivos MP3 / M4A que existam em diretórios diferentes uns dos outros. Note que é importante obter a citação de variáveis corretas, pois os arquivos de música geralmente têm muitos espaços em seus nomes e bash interpreta espaços como itens de separação nas listas.

#!/bin/bash

# Name of directory under which you music is stored.
SOURCE_DIR=/path/to/current/music/dir

# Name of directory you want to move the MP3s to.
DEST_DIR=/path/to/mp3/destination/dir

# Create the destination directory for the moved MP3s, if it doesn't already exist.
[ ! -d $DEST_DIR ] && mkdir -p $DEST_DIR

# Search for .mp3 files starting in $SOURCE_DIR
find $SOURCE_DIR -type f -name "*.mp3" | while read fin
do

  # Create the equivalent file name with .m4a extension.
  fm4a=${fin/.mp3/.m4a}

  # If a file with .m4a extension exists, move the .mp3 file to the destination dir.
  # In the event of a file name clash in the destination dir, the incoming file has
  # a number appended to its name to prevent overwritng of the existing files.
  [ -f "$fm4a" ] && mv -v --backup=numbered "$fin" $DEST_DIR/
done

##
## End of script.
##

Antes de executar essa versão, sugiro substituir a linha antes de done pela seguinte linha como uma espécie de execução a seco, para que você possa ter uma ideia do que será movido:

  [ -f "$fm4a" ] && echo "Moving $fin to $DEST_DIR/"

(Comentários de sugestão que corrigem meu uso perigoso de find e while .)

    
por 31.01.2014 / 15:06
2

mv emitirá alguns erros de arquivo não encontrados, mas isso deve funcionar

ls -1 *.m4a | sed 's#\(.*\).m4a#mv .mp3 otherdir#' | sh
    
por 04.03.2014 / 06:36
0

Não consigo pensar em uma maneira de fazer isso no shell; e mesmo se você pudesse, seria muito limitado quando comparado ao que um programa poderia alcançar. Eu sei com certeza duplicar limpador (vulcão digital) pode procurar por arquivos de música e mover a versão mp3 de qualquer duplicado em outro lugar. Ele faz correspondência difusa também. link veja o adware na instalação ...

    
por 31.01.2014 / 02:58
0

Esta solução foi testada em / bin / bash a partir de um sistema GNU / Linux. Eu estou supondo que o seu mac tem um / bin / bash para isso, junto com awk, tr, grep, ls, rm e wc. (/ bin / bash é o executável shell padrão). Este script também assume que você tem APENAS arquivos mp3 e m4a, e que alguns diretórios não contêm arquivos mp3 e m4a. (escreveu no

Novamente, isso pressupõe que o Mac tenha bash, tr, grep, ls, rm e wc (utilitários UNIX padrão, iirc)

(desculpe por práticas de script incorretas, não sou muito bom em scripts de shell)

(diretório = pasta)

(Especifique o diretório de destino usando o PRIMEIRO ARGUMENTO) (ou seja, ./thisscript.sh directoryname)

(antes de fazer isso, leia todo o post)

Crie um arquivo de texto no diretório pai de todos os diretórios com a música neles e cole-o em: link Agora navegue até o diretório no shell e digite:

bash <filename>

Note que você não pode fazer algo tão complicado assim sem um script. ;)

Andando por você:

#!/bin/bash

Diz-nos para usar / bin / bash, o shell.

todir=$1

Analise o primeiro argumento como o diretório de destino e armazene-o em $ todir (uma variável).

cd $( dirname $0 )

Apenas para tornar as coisas seguras, para que possamos executar o script a partir de qualquer diretório, contanto que o script esteja no mesmo diretório que todos os diretórios do material de música.

DIRLIST=$( ls -F | grep '/' | tr -d '/' )

Listar os diretórios.

for DIR in $DIRLIST
do

Iterar pelos diretórios.

    mp3num=$( ls $DIR | grep -c \.mp3 )
    m4anum=$( ls $DIR | grep -c \.m4a )
    filnum=$( ls $DIR | wc -l )

Armazene algumas variáveis que precisamos (número de mp3's, número de m4a's, número de arquivos

    echo $DIR $mp3num $mp4num $filnum

(somente para depuração)

    if [ $DIR = $todir ]; then
        continue
    fi

Se o diretório que estamos vendo na iteração atual, pule-o.

    if [ $m4anum = 0 -o $mp3num = 0 ]
    then
        continue

Se o diretório não tiver m4a ou nenhum mp3, pule-o.

    elif [ $mp3num != 0 -a $m4anum != 0 ]
    then
        mv $DIR/*.mp3 $todir

Se o diretório tiver alguns mp3's e alguns m4a's, mova todos os mp3's no diretório para o diretório de destino especificado.

    fi
done

Terminamos.

A razão pela qual isso provavelmente funcionará nos macs também é porque os macs são baseados em unix. Eles também têm o bash, que é a linguagem shell que estamos usando aqui, e todos os pequenos utilitários unix (eu os procurei e eles apareceram como o primeiro resultado no Mac Manpages).

Além disso, certifique-se de que o diretório de destino EXISTE ou não funcionará ...

    
por 31.01.2014 / 06:00