automaticke triedenie fotiek

Všetko ohľadom Linuxu...
sulo34
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 399
Registrovaný: 27 jún 2005, 22:48
Bydlisko: 404 Not found !!
Kontaktovať používateľa:

automaticke triedenie fotiek

Príspevok od používateľa sulo34 »

zdravim , potrebujem zlozit jeden prikaz ktory dokaze to ze mi z mobilu zkopiruje fotky ktorych nazov je v urcitom formate vytvori zlozku podla toho v akom dni bola fotka zfotena , a nakoniec vsetky fotky zo zdroja vymaze ,
fotky su v tvare:
011220102038.jpg
01-den, 12-mesiac, 2010-rok , 2038-nahodnecislo
folder v ktorom sa bude vyhladavat napr. /media/nokia/fotos/a-subfoldre
folder do ktoreho to bude vkladat rok/mesiac/den napr /media/disk/2010-12-01
a nakoniec budu vsetky fotky z /media/nokia/fotos/a-subfoldre vymazane
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: automaticke triedenie fotiek

Príspevok od používateľa pato83 »

Nazdar, tak nasledovne by ti malo fungovat, ako si opisal:

Kód: Vybrať všetko

SOURCE="${HOME}/mobil"; TARGET="${HOME}/disk"; for FILE in "${SOURCE}"/*.jpg; do BASENAME="${FILE##*\/}"; DATE="${BASENAME:0:8}"; DIR="${DATE:4:4}-${DATE:2:2}-${DATE:0:2}"; [[ -d "${TARGET}/${DIR}" ]] && mv "${SOURCE}${FILE}" "${TARGET}${DIR}" || ( mkdir "${TARGET}${DIR}" && mv "${FILE}" "${TARGET}${DIR}" ); done 
Je nutne v tomto pripade zadavat absolutne cesty k zdroju fotiek a rovnako k miestu pre ich ulozenie. Da sa to napisat aj krajsie a domyselnejsie, ale to by som uz nerad v riadku ale skor do skriptu vzhladom na citatelnost. Tu je to este s popisom v podstate to iste:

Kód: Vybrať všetko

#! /bin/bash

# prvy parameter je zdroj fotiek
SOURCE="${1}"
# druhy parameter je cielovy adresar
TARGET="${2}"
# treti parameter je pripona, nie je povinna
EXTENSION="${3}"
# vychodzia pripona je jpg ako si si zelal, ak nebolo inak zadane
EXTENSION=${EXTENSION:-jpg}

# overenie, ci zadane cesty existuju
SOURCE="$(readlink -f "${SOURCE}" 2>/dev/null )"
if [[ $? -eq 0 && -d "${SOURCE}" && -r "${SOURCE}" ]]
then
	:
else
	echo "${SOURCE} neexistuje, nie je adresar alebo nie je mozne citat !" && exit 1
fi

TARGET="$(readlink -f "${TARGET}" 2>/dev/null )"
if [[ $? -eq 0 && -d "${TARGET}" && -r "${TARGET}" ]]
then
	:
else
	echo "${TARGET} neexistuje, nie je adresar alebo nie je mozne zapisovat !" && exit 1
fi

# je nutne pouzivat bash vo verzii 4 a vyssie
# nacita rekurzivne vsetky subory s danou priponou
# v specifikovanom adresare
# p.s.: Velmi jednoducha nahrada pre find
shopt -s globstar
ARRAY_FILES=( "${SOURCE}"/**/*."${EXTENSION}" )
shopt -u globstar


for FILE in "${ARRAY_FILES[@]}"
do
	# nie je nutne volat basename, z hodnoty premennej FILE
	# odstrani najdlhsi nalez cokolvek az po lomitko v smere od zaciatku hodnoty
	BASENAME="${FILE##*\/}"
	# podla specifikacie, je prvych osem znakov datum
	DATE="${BASENAME:0:8}"
	# nazov buduceho adresare pre fotky so spolocnym datumom
	DIR="${DATE:4:4}-${DATE:2:2}-${DATE:0:2}"
	# ak existuje uz adresar v cielovom adresare ...
	if [[ -d ${TARGET}/${DIR} ]]
	then
		# ... tak fotku presunieme
		mv "${FILE}" "${TARGET}/${DIR}"
	else
		# ... inak musime prv vytvorit ten adresar,
		# a teda sa pokusame prave kopirovat prvu fotku z toho
		# specifickeho dna
		mkdir "${TARGET}/${DIR}"
		mv "${FILE}" "${TARGET}/${DIR}"
	fi
done

exit 0
Tu uz nie je nutne zadat absolutnu cestu a je to uz mudrejsie nez ten "one-liner" predtym. Sposob spustania tohto skriptu je nasledovny:

Kód: Vybrať všetko

$ skript "zdroj fotiek" "ciel pre fotky" png
p.s.: Je to velmi narychlo, takze moze to mat dake chybicky. ;)
p.s.2: Trosku som to dodatocne upravil, kedze starsia verzia neprehladavala rekurzivne a podadresare.
sulo34
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 399
Registrovaný: 27 jún 2005, 22:48
Bydlisko: 404 Not found !!
Kontaktovať používateľa:

Re: automaticke triedenie fotiek

Príspevok od používateľa sulo34 »

dakujem velmi si to vazim ;) doma to vyskusam a ozvem sa, ale je tu este jedna vec , zabudol som na videa , takze potrebujem jpg aj mp4 , kludne edituj prispevok hore
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: automaticke triedenie fotiek

Príspevok od používateľa pato83 »

sulo34 napísal:dakujem velmi si to vazim ;) doma to vyskusam a ozvem sa, ale je tu este jedna vec , zabudol som na videa , takze potrebujem jpg aj mp4 , kludne edituj prispevok hore
Je uplne jedno, ci to bude jpg, mp4, png, xxx atd. Ten skript nijak neoveruje, ci to je obrazok, textovy subor alebo video. Podstata je, ze vyhlada podla pripony subory rekurzivne v zadanom adresare a nasledne vezme nazov kazdeho jedneho suboru podla daneho formatu a roztriedi ich a vytvori tak strukturu podla dni. Takze si mozes skusit aj s mp4. Akurat ta to bude stat dvakrat spustenie, ale pokial uvedies ako cielovy adresar vzdy jeden, tak nenastanu duplicity v podobe adresarov.

//autoeditácia príspevku (11 Dec 2010, 21:05)
Tak som mal troska volna, tak tu mas taku serioznejsiu verziu. Ma to help, takze nikdy nezabudnes, oc to ma robit a mozes zadat naraz viacero pripon a taktiez overovania mime ine aj formatu nazvu suboru atd.

Kód: Vybrať všetko

#! /bin/bash
#################################################################################
#										
# Author: Patrik Uhrak								
# Email: [email protected]						
# Licence : GPLv3 http://www.opensource.org/licenses/gpl-3.0.html 		
# Description: Kopirovanie suborov s nazvom v specfifickom formate a pripone	
#	       Format nazvu suboru: [Rok][Mesiac][Den][Nahodne cislo].[pripona]	
#										
#################################################################################


#################################################################################
#										
#				READONLY VARIABLES				
#										
#################################################################################

# Verzia skriptu
readonly VERSION='0.1_10-12-2010'
# Hodnoty exit status pri specifickej udalosti
E_BASH=1
E_PATH=2
E_PARAM=3

#################################################################################
#										
#				GLOBAL VARIABLES				
#										
#################################################################################

# SOURCE - kde hladat subory pre kopirovanie
# TARGET - kam kopirovat subory
# EXTENSION - pripona suborov (vychodzia je jpg)
declare SOURCE TARGET EXTENSION 

#################################################################################
#										
#				VERIFYING FUNCTIONS				
#										
#################################################################################

# Je nutne mat bash vo verzii 4 a vyssie z dovodu pouzitia globstar
CheckBash()
{
[[ ${BASH_VERSINFO} -ge 4 ]] || (echo -e "Je nutne mat nainstalovany bash vo verzii 4 a vyssie !" && exit ${E_BASH})
}

CheckDirs()
{
local DIR

for DIR in {SOURCE,TARGET}
do
	if [[ ${DIR} == SOURCE ]]
	then
		SOURCE="$(readlink -f "${!DIR}" 2>/dev/null )"
		if [[ $? -eq 0 && -d "${SOURCE}" && -r "${SOURCE}" ]]
		then
			:
		else
			echo "${SOURCE} neexistuje, nie je adresar alebo nie je mozne citat !" && exit ${E_PATH}
		fi
	elif [[ ${DIR} == TARGET ]]
	then
		TARGET="$(readlink -f "${!DIR}" 2>/dev/null )"
		if [[ $? -eq 0 && -d "${TARGET}" && -w "${TARGET}" ]]
		then
			:
		else
			echo "${TARGET} neexistuje, nie je adresar alebo nie je mozne citat !" && exit ${E_PATH}
		fi
	fi
done
}

#################################################################################
#										
#				MAIN FUNCTIONS					
#										
#################################################################################

LoadParameters()
{
while [[ ${1} ]]
do
	case "${1}" in

		-s | --source )
			SOURCE="${2}"
			shift 2
		;;

		-t | --target )
			TARGET="${2}"
			shift 2
		;;

		-e | --extension )
			EXTENSION="${2}"
			shift 2
		;;

		-v | --version )
			echo "${VERSION}"
			exit 0
		;;

		-h | --help )
			Help
			exit 0
		;;

		* )
			echo "Neznamy parameter: ${1}"
			exit ${E_PARAM}
		;;

	esac
done
}

Help()
{
cat <<_EOF
Kopirovanie suborov s nazvom v specfifickom formate a pripone
Format nazvu suboru: [Rok][Mesiac][Den][Nahodne cislo].[pripona]

Autor: Patrik Uhrak
Email: projectsdevel[ at ]gmail[ dot ]com
Verzia: $VERSION

Pouzitie:
	${0##*\/} -s [ZDROJOVY ADRESAR] -t [CIELOVY ADRESAR] -e [PRIPONA]

Moznosti:
	-s ; --source : Zdrojovy adresar, odkial sa zkopiruju subory
	-t ; --target : Cielovy adresar, kam sa subory kopiruju
	-e ; --extension : Pripona v nazve suboru pre kopirovanie
			   - pre specifikovanie viacerych pripon je nutne oddelit jednotlive
			     pripony ciarkou napr. ogg,png,sh
Ukazky:
	${0##*\/} -s /usr/share/ -t ${HOME} -e png
	${0##*\/} --source /usr/share -t ${HOME} -e ogg,png,tar.gz
_EOF
}

FindFiles()
{
local EXT

shopt -s globstar
EXTENSION="${EXTENSION//,/ }"

for EXT in ${EXTENSION}
do
	eval ARRAY_FILES=( ${ARRAY_FILES[@]} "${SOURCE}"/**/*."${EXT}" )
done
shopt -u globstar
}

GetNewDirName()
{
local BASENAME DATE
BASENAME="${FILE##*\/}"
# podla specifikacie, je prvych osem znakov datum
DATE="${BASENAME:0:8}"
# nazov buduceho adresara pre fotky so spolocnym datumom
DIR="${DATE:4:4}-${DATE:2:2}-${DATE:0:2}"
}

CopyFiles()
{
declare -i INDEX

for FILE in "${ARRAY_FILES[@]}"
do
	GetNewDirName
	# vzhladom na pozadovany format je najjednoduchsie to poslat na vstup pre date
	# ak vrati exit status s hodnotou 0, tak sa pokracuje, pretoze je format v
	# pozadovanom tvare [ROK]-[MESIAC]-[DEN]
	# ak by tak nebolo, pokracuje sa dalsim suborom
	if date --date "${DIR}" &>/dev/null
	then
		let INDEX++
	        # ak existuje uz adresar v cielovom adresare ...
		if [[ -e ${TARGET}/${DIR} ]]
		then
			# a zaroven ak je adresar ( moze byt aj symlink na adresar )
			if [[ -d ${TARGET}/${DIR} ]] 
			then
				# a zaroven ak je zapisovatelny cielovy adresar
				if [[ -w ${TARGET}/${DIR} ]]
				then
					mv "${FILE}" "${TARGET}/${DIR}"
				else
					echo -e "Nie je mozne kopirovat subor do cieloveho adresara. Do cieloveho adresara ${TARGET}/${DIR} nie je mozne zapisovat !"
				fi
			else
				echo -e "Nie je mozne kopirovat subor do cieloveho adresara.\nCielovy adresar ${TARGET}/${DIR} nie je adresar !"
			fi
		else
			# ak neexistuje cielovy adresar, tak ho mozme kludne vytvorit
			# TARGET bol overeny vo funkcii CheckDirs
			mkdir "${TARGET}/${DIR}"
			mv "${FILE}" "${TARGET}/${DIR}"
		fi
	fi
done
}

#################################################################################
#										
#				MAIN						
#										
#################################################################################

clear
CheckBash
LoadParameters "${@}"
CheckDirs
FindFiles
CopyFiles

exit 0
Myslim, ze je to celkom zrozumitelne napisane, tak ak potrebujes zmeny, tak si ich dorobis isto s troskou chcenia. ;) Zatial.
Napísať odpoveď