Portál AbcLinuxu, 10. května 2025 05:32
PREFIX="/cilovy/adresar/"
Do proměné SRC zase adresář, který chceš zpracovat:
SRC="/ZDROJOVY/adresar/"
Zrušíme nastavení jazyka, pro jistotu kvůli formátu data
LANG=C; LANGUAGE=C
A teď to přijde:
find $SRC -type f |
Ti vypíše všechn soubory,
while read i; do
je postupně po jednom načte do proměné i
DATUM=`ls -l --full-time "$i" | awk '{print $6}'`;
uložíš si datum vytvoření souboru
CESTA=$PREFIX/`date -d "$DATUM" +%Y/%m/%d`;
nastavíš si cílový adresář včetně cesty z data,
echo $CESTA;
pro jistotu vypíšeš
mkdir -p $CESTA;
vytvoříš cílový adresář (pokud existuje, nevadí)
cp -p "$i" "$CESTA";
zkopíruješ...
done
a hotovo!
Tak si to zopakujeme:
PREFIX=/cilovy/adresar/ SRC=/zdrojovy/adresar/ LANG=C LANGUAGE=C find "$SRC" -type f | while read i; do DATUM=`ls -l --full-time "$i" | awk '{print $6}'`; CESTA=$PREFIX/`date -d "$DATUM" +%Y/%m/%d`; echo $CESTA; mkdir -p $CESTA; cp -p "$i" "$CESTA"; doneSkrupt nepřesouvá, ale kopíruje, takže si můžeš zkontrolovat, jestli je vše v pořádku. Pokud jsi ostrostřelec, tak místo "cp -p" použij mv.
$PREFIX/2014/12/24/
. Pokud bys chtěl adresáře $PREFIX/24.12.2014/
, tak uprav řádek CESTA=...
:
CESTA=$PREFIX/`date -d "$DATUM" +%d.%m.%Y`;
DATUM=`exiftool -d "%Y-%m-%d" -CreateDate "$i" | awk '{print $4}'`To má ale nevýhodu, že EXIF nemusí být správně nastavený -- datum může chybět. Potom potřebuješ nějaký fallback:
[ "x$DATUM" == "x" ] && DATUM=`ls -l --full-time "$i" | awk '{print $6}'`;ten vezme datum ze souborového systému tak jako původní skript, pokud EXIF neobsahuje Create Date značku. Pokud Ti to vyhovuje takhle, tak řádek
DATUM=...
původního skriptu nahraď těma dvěma výše uvedenýma.
sh /var/www/prerovnani.shnebo mu pridas priznak spusittelny
chmod +x /var/www/prerovnani.sha poustis ho rovnou:
/var/www/prerovnani.shpokud ses v adrasar kde je script, tak nemusis psat cestu ale uvedes aktualni adresar ktery znazornuje znak ".":
./prerovnani.shnebo si script vlozis napr. do adresare /usr/local/bin/ (kterej je v promene $PATH) a pak bez cesty odkudkoliv:
prerovnani.sh
Adresář nebo soubor neexistuje PREFIX=/var/www/prerovnani/test/
/var/www/prerovnani.sh: řádek 11: chyba syntaxe poblíž neočekávaného tokenu „done“
/var/www/prerovnani.sh: řádek 11: `done'
Pro kontrolu přidávám i skript:
PREFIX=/var/www/prerovnani/test/
SRC=/var/www/prerovnani/
LANG=C
LANGUAGE=C
find "$SRC" -type f | while read i; do
[ "x$DATUM" == "x" ] && DATUM=`ls -l --full-time "$i" | awk '{print $6}'`;
CESTA=$PREFIX/`date -d "$DATUM" +%Y.%m.%d`;
echo $CESTA;
mkdir -p $CESTA;
cp -p "$i" "$CESTA";
done
#!/bin/sh if [ $# = 0 ] then echo "Usage: $0 *.jpg" >&2 echo " Organizes photos to subdirectories by date they were created." >&2 exit fi for f in $@ ; do d=`exiftags "$f" | sed -n '/^Image Created:/s/^[^:]\+: \(....\):\(..\):\(..\).*/\1-\2-\3/p'` [ -d "$d" ] || mkdir "$d" && mv -v "$f" "$d/" doneNačte to datum z EXIF, vyrobí odpovídající adresář a fotku přesune do něj. Jednoduché a elegantní.
exiftool -d "%Y-%m-%d" -CreateDate "$f" | awk '{print $4}' exiftags "$f" | sed -n '/^Image Created:/s/^[^:]\+: \(....\):\(..\):\(..\).*/\1-\2-\3/p'
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.