Portál AbcLinuxu, 25. listopadu 2025 10:52
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";
done
Skrupt 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/"
done
Nač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.