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
automaticke triedenie fotiek
Re: automaticke triedenie fotiek
Nazdar, tak nasledovne by ti malo fungovat, ako si opisal:
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:
Tu uz nie je nutne zadat absolutnu cestu a je to uz mudrejsie nez ten "one-liner" predtym. Sposob spustania tohto skriptu je nasledovny:
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.
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 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 0Kód: Vybrať všetko
$ skript "zdroj fotiek" "ciel pre fotky" pngp.s.2: Trosku som to dodatocne upravil, kedze starsia verzia neprehladavala rekurzivne a podadresare.
-
sulo34
Medium Star
- Príspevky: 399
- Registrovaný: 27 jún 2005, 22:48
- Bydlisko: 404 Not found !!
- Kontaktovať používateľa:
Re: automaticke triedenie fotiek
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
Re: automaticke triedenie fotiek
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.sulo34 napísal:dakujem velmi si to vazimdoma to vyskusam a ozvem sa, ale je tu este jedna vec , zabudol som na videa , takze potrebujem jpg aj mp4 , kludne edituj prispevok hore
//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