Lê arquivos do diretório e os organiza por extentsion em pastas correspondentes

1

Estou tentando criar um script de função bash que me permita criar vários diretórios com os nomes abaixo. Também estou tentando organizar arquivos por extensão em suas pastas correspondentes (ou seja, .jpg em imagens, .doc em documentos, .gif em mídia, etc). A primeira parte está bem, é a segunda metade depois que os diretórios são feitos que me confundem.

    #!/bin/bash
    echo "Creating directory categories"

    function make_folder 
    {
        cd -; cd content; sudo mkdir ./$1
    }

    make_folder "documents"
    make_folder "other"
    make_folder "pictures"
    make_folder "media"

    echo "Directories have been made"; cd -
    exit

    ext="${filename##*.}" #set var ext to extension of files

    find ./random -name | #find and list all files in random folder
                          #pipe results of find into if statement

    if ext == ["jpg"; "jpeg"; "png"] #move ".jpg", etc to new destination
         then
           mv /path/to/source /path/to/destination

    elif ext == [".gif"; ".mov"] #move ".gif", etc to new destination 
         then
           mv /path/to/source /path/to/destination
    else                         #move other files into to new destination
           mv /path/to/source /path/to/destination
    fi
    
por lettda 13.04.2016 / 20:04

2 respostas

1

Do topo da minha cabeça, eu usaria a declaração 'case' no final.

ou seja,

case "$FILE" in
    *.jpg|*.jpeg)
        mv "$FILE" to where you want it
        ;;
    *.gif|*.mov)
        mv "$FILE" to where you want it
        ;;
    *)
        echo "Unmanaged file type: $FILE, skipping"
        ;;
 esac

... no entanto, você precisa envolvê-lo em um contêiner de loop, e você viu determinado a usar o find e, em seguida, talvez seja apropriado com:

 find <your stuff> | 
     while read FILE
     do
         ...case statement goes here
     done

Apenas meus US $ 0,02

Felicidades! / Daniel

    
por 13.04.2016 / 21:56
0

Sua função make_folder é desnecessariamente complicada: todas essas mudanças no diretório atual estão tornando sua vida mais complicada. Além disso, você não precisa de sudo : por que você criaria os diretórios como root? Apenas chame mkdir .

mkdir documents other pictures media

Se você quiser que o script funcione mesmo que os diretórios já existam, use mkdir -p :

mkdir -p documents other pictures media

Se você quiser usar find , não imprima os nomes e, em seguida, analise-os. Faça com que find execute o código desejado com -exec . Para fazer mais do que invocar um programa simples, invoque um shell. Com <code>sh -c '<em>shell code</em>' , o próximo argumento para sh após o código shell está disponível no código shell como $0 . Sempre coloque aspas duplas em torno de variável substituições . No snippet de shell, a maneira natural de discriminar por extensão é com um caso construir no nome do arquivo. Eu uso a expansão de parâmetro construa ${0##*/} para obter o nome base do arquivo (com tudo até a última barra removida). O teste [ -e "$destination_file" ] testa se o arquivo de destino já existe, para evitar sobrescrever um arquivo com o mesmo nome que foi movido de um diretório diferente.

find random -exec sh -c '
  case "$0" in
    *.gif|*.png|*.jpg) destination_directory=pictures;;
    …
    *) destination_directory=other;;
  esac
  destination_file="$destination_directory/${0##*/}"
  if [ -e "$destination_file" ]; then mv "$0" "$destination_file"; fi
' {} \;

Uma abordagem alternativa, que pode ser um pouco mais lenta se você tiver uma quantidade enorme de arquivos, mas é muito mais simples de escrever, é copiar o destino dos arquivos por destino. No Linux, graças aos utilitários GNU, é tão simples quanto

find random \( -name '*.gif' -o -name '*.png' -o -name '*.jpg' \) -exec mv -n -t pictures {} +

e da mesma forma para outros diretórios de destino. Usar + em vez de ; no final de find -exec acelera um pouco invocando mv em lotes.

Mas, no que você está fazendo, na verdade, em bash ou zsh, você não precisa de find . Use o ** wildcard para percorrer o diretório recursivo.

shopt -s globstar # necessary in bash to enable **
mv -n random/**/*.gif random/**/*.png random/**/*.jpg pictures/

Observe que suponho que você queira colocar todos os arquivos diretamente sob os diretórios de destino. Se você quiser reproduzir a hierarquia de diretórios, isso é um assunto diferente e ferramentas diferentes seriam apropriadas.

    
por 14.04.2016 / 01:41