Script para distribuir cada arquivo ao seu diretório associado

1

O cenário é:

Eu tenho um diretório com milhares de fotos no formato YYYYMMDDXXX

YYYY: stands for year
MM: stands for month
DD: stands for day
XXX: stands for an ID of the picture, it ranges from 1 to n characters

O necessário:

Mova cada foto para a pasta desse dia. Eu, e, leia o nome da imagem suponha que seu nome seja 201504121A , então essa imagem será movida para o diretório denominado 12-04-2015 e renomeie-a de 201504121A para apenas ID, o que significa 1A . Se este diretório não for fundado, crie-o.

    
por Maythux 26.05.2015 / 10:20

2 respostas

6

No bash:

#! /bin/bash

for i
do
    f="${i##*/}"
    y="${f:0:4}"
    m="${f:4:2}"
    d="${f:6:2}"
    x="${f:8}"
    mkdir -p "$d-$m-$y" && mv "$i" "$d-$m-$y/$x"
done

Salve como um script (digamos, mover.sh ) e faça:

/path/to/mover.sh *

Ou:

find /path/to/pics -type f -exec /path/to/mover.sh {} +

Use um echo em vez de mkdir e mv para testá-lo.

  • f="${i##*/}" - obtém o nome do arquivo que remove os componentes do diretório.
  • y="${f:0:4}" e os outros quatro - obtém as substrings nessa posição desse comprimento.

Ou, usando expressões regulares em vez de substrings, com o benefício de realmente testar o padrão também:

#! /bin/bash

for i
do
    f="${i##*/}"
    if [[ $f =~ ([0-9]{4})([0-9]{2})([0-9]{2})(.*) ]]
    then
        y="${BASH_REMATCH[1]}"
        m="${BASH_REMATCH[2]}"
        d="${BASH_REMATCH[3]}"
        x="${BASH_REMATCH[4]}"
        mkdir -p "$d-$m-$y" && mv "$i" "$d-$m-$y/$x"
    fi
done
    
por muru 26.05.2015 / 10:46
0

Você pode ser um usuário veterano de Linux / Unix. Mas eu escreverei as instruções considerando que você é um novo usuário Linux como eu, para que eu não perca nada da minha parte ...

Aviso !!!

Antes de executar este script, certifique-se de ter feito backup de todas as imagens nas quais deseja executar este script para fazer a operação. Existem muitas variáveis, como a contagem de palavras da convenção de nomes, etc., que podem afetar o resultado da execução. Por favor, certifique-se de fazer backup de seus dados ... Nada será excluído, mas o script pode alterar seus nomes de arquivo irregularmente se houver algum problema.

Não execute este script se alguma imagem contiver um ID com mais de 2 caracteres.   Como você mencionou antes "XXX: significa um ID da foto, varia de 1 a n caracteres"

"e deu um exemplo de" suponha que seu nome é 201504121A, então essa imagem será movida para o diretório 12-04-2015 e renomeá-la de 201504121A para apenas ID, o que significa 1A "

O ID das imagens deve ser algo como 1A 1B 1C 12 C 22 etc .... Você entendeu ... Deve ter 2 caracteres e não um caractere como 1 2 3 ... ou 3 caracteres como 222 666 777 etc ... deve ser exatamente 2.Se houver algumas imagens assim ... eu recomendo que você modifique o meu código para se adequar ao seu propósito e lembre-se sempre de fazer backup dos seus dados antes da execução do script.

Escrito em Bash

#!/bin/bash
#Developed by Sayan Bhattacharjee Date:26th may 2015 Tuesday Time 4:46PM IST
# conatact :[email protected] or askubuntu.com  Username:Sayan Bhatttacharjee
#More updates may come if required....
#Feel free to modify and redistribute this script
echo "Enter the extension of the files"
echo "like .jpg .png .bmp etc"
echo "make sure to enter . before the extension"
read extension
ls *$extension  > filenames
echo "Showing all the files of the extension present in the following directory"
cat filenames
echo "Checking line read option"
## while it reads line by line it will perform the required actions
while read line
do
echo "==============================================================="
    imageName=$line # updates the name of the image one by one in each loop according to how they are saved in the file
    echo "Imagefile is - $name"
    echo "Running file name resolver"
    echo "Running year resolver"

    year=${imageName:0:4 } #takes 4 lettters from the front
    echo "Year is $year"
    echo "Running month resolver"
    abc=${imageName: (-10) } # it will extract 10 characters from  the end   of 201504121A.jpg to produce 04121A.jpg

    month=${abc:0:2 } #It takes two characters from front of 04121A.jpg to produce 04

    echo "month is $month"
    echo "Running day resolver" 
    abc1=${imageName: (-8) } # it will extract 8 characters from  the end   of 201504121A.jpg to produce 121A.jpg
    day=${abc1:0:2 } #It takes two characters from front of 121A.jpg to produce 12
    echo "day is $day"

    echo "Running ID resolver"
    abc2=${imageName: (-6) }  # it will extract 6 characters from  the end   of 201504121A.jpg to produce 1A.jpg
    ID=${abc2:0:2 } #It takes two characters from front of 1A.jpg to produce 1A
    echo "$ID"
echo "Present Working Directory is"
pwd > base.txt #saving present working directory
baseDirectory='cat base.txt'
echo "$baseDirectory"
echo ".............................................................."
echo "Running Directory creation and Image Insertion"
echo "Directory will not be created if it exists"
mkdir $day-$month-$year
echo "moving image and renaming it........"
mv $baseDirectory/$year$month$day$ID$extension $baseDirectory/$day-$month-$year/$ID$extension
cd $day-$month-$year
#echo "Present Working Sub Directory is"
#pwd > subpwd.txt #saving present working directory
#presentWorkingSubDirectory='cat subpwd.txt'
#echo "$presentWorkingSubDirectory"
echo "Returning to Base Directory"
cd $baseDirectory
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
done < filenames
echo "execution finished"

Salve o bloco de código no arquivo de texto como dataOrganiser.sh (ou qualquer outro nome que você preferir; mas a extensão deve ser .sh ). Certifique-se de que o dataOrganiser.sh esteja no diretório onde estão todas as suas imagens. Caso contrário, ele não funcionará e você terá que configurá-lo manualmente ... Também esteja ciente de que ele será capaz de trabalhar em arquivos de imagem de apenas uma extensão de cada vez .... por exemplo, ele funcionará em .jpg primeiro, depois em .png e outros ... a escolha da extensão será ser dado a você em runtime .. Também é possível usá-lo em outros formatos de arquivo como .txt .doc .pdf etc

Em seguida, dê autoridade executável ao arquivo dataOrganiser.sh digitando

 sudo chmod 755 /path/to/dataOrganiser.sh

755 lhe dará leitura, escreva e execute autoridade e leia e escreva autoridade aos outros. ser-lhe-á pedida a sua senha ..enter-la para executar como sudo. Agora execute o script digitando

/path/to/file/dataOrganiser.sh

Depois que o script for iniciado, você será solicitado a fornecer a extensão das imagens ... você pode fornecer apenas um tipo de extensão de cada vez. E as extensões que podem ser dadas devem ser feitas de três alfabetos como jpg bmp png gif, etc. Qualquer coisa como tiff não funcionará..você tem que modificar o script ..... novamente, certifique-se de fazer backup das imagens

Quando solicitado a digitar o nome da extensão, insira-o como .jpg ou .bmp ou .png ou .gif, pois será necessário fornecer o. (ponto antes da extensão funcionar).

Você se lembrou de backup mais cedo ?? .. se você não fechar o backup do programa e voltar a executar o programa novamente ..... Eu não quero causar nenhum dano a alguém dados

Eu tenho dado todas as informações que vêm à minha cabeça agora ... por favor, certifique-se de seguir todas as instruções dadas acima e novamente Você se lembrou de fazer backup de suas fotos

    
por Sayan Bhattacharjee 26.05.2015 / 14:05