Portál AbcLinuxu, 10. května 2025 05:32

Dotaz: Přerovnání souborů do složek

3.8.2015 21:51 SFilip
Přerovnání souborů do složek
Přečteno: 528×
Odpovědět | Admin
Zdravím,

nevěděl by někdo, jak udělat skript, který překopíruje do složek soubory - na základě data úpravy?

Např. img1.jpg (datum pořízení: 10.07.2015) -> Vytvoření složky 10.07.2015, pokud neexistuje a přesunout soubory podle dat.

Předem díky za veškerou pomoc
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.8.2015 22:20 NN
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na jakou uroven by jsi to chtel granulovat? Dny, mesice, roky? Prikaz find znas?
3.8.2015 22:47 SFilip
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Dny, měsíce a roky (např. 01.01.2015). Přiznám se, že jsem v tomhle úplný začátečník :(

Díky!
3.8.2015 23:51 mhepp | skóre: 22
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Odpovědět | | Sbalit | Link | Blokovat | Admin
Do proměné PREFIX si nastav (absolutní) cestu kam chceš kopírovat:

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.
3.8.2015 23:57 mhepp | skóre: 22
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Vidíš...

Skript vyvoří strukturu např. $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`;
4.8.2015 00:13 mhepp | skóre: 22
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Ještě jsem si teď uvědomil, že chceš zpracovávat fotky. To by se Ti mohlo hodit brát čas z EXIF-u:
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.
4.8.2015 01:45 SFilip
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Mockrát děkuji za vysvětlení a řešení.

Ještě bych měl dotaz, při pokusu o spuštění skriptu se mi zobrazila tato chyba (s pomocí ldd)

ldd: ./sh: Adresář nebo soubor neexistuje /var/www/prerovnani.sh: není dynamickým spustitelným kódem

Nevěděl by někdo, jak tento problém vyřešit? Jedu na Ubuntu 14.04 LTS (GNU/Linux 3.13.0-36-generic x86_64)
4.8.2015 02:02 nobody
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
s pomoci ldd??? ldd je nastroj na zobrazeni jake sdilene knihovny vyuziva binarni program...

skript se pousti pomoci sh:
sh /var/www/prerovnani.sh
nebo mu pridas priznak spusittelny
chmod +x /var/www/prerovnani.sh
a poustis ho rovnou:
/var/www/prerovnani.sh
pokud ses v adrasar kde je script, tak nemusis psat cestu ale uvedes aktualni adresar ktery znazornuje znak ".":
./prerovnani.sh
nebo si script vlozis napr. do adresare /usr/local/bin/ (kterej je v promene $PATH) a pak bez cesty odkudkoliv:
prerovnani.sh
4.8.2015 02:14 SFilip
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Pořád mi to ale vyhazuje chybu: find: `/var/www/prerovnani/test/\r': No such file or directory

Cesty mám nastavené takto:

PREFIX=/var/www/prerovnani/

SRC=/var/www/prerovnani/test/
4.8.2015 14:07 mhepp
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Smaž řádek SRC a ještě i další a napiš je znovu. Na konci rádku Ti zůstalo nějaké smetí v podobě nezobrazitelných znaků.
4.8.2015 15:25 SFilip
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Vše jsem udělal a zobrazuje se následující:

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
4.8.2015 15:46 mhepp | skóre: 22
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Příloha:
Tak jak je v příloze, tak funguje...
4.8.2015 16:28 SFilip
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Moc moc moc díky! Funguje to! :) Můžu se ještě zeptat, jaký program na to psaní používáš?

Díky moc
4.8.2015 16:37 nobody
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
nainstaluj manager mc (midnight commander), je to obdoba norton/windows/total commanderu ve windows, a pres F4 tam mas editor co zvyraznuje syntax, ma sloupcove bloky, prevadi kodovani i spante zalamovani radku kdyz tam dotahnes neco z Widnows ;)
4.8.2015 16:33 nobody
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
ze ty si provadel upravy skriptu na Windows a jeste v nejakem pochybnem editoru? ;)
4.8.2015 16:40 SFilip
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Moc díky za radu :) Ano, na Windows a v poznámkovém bloku :) Aspoň už vím, co a jak.

Ještě jednou díky za pomoc a trpělivost
4.8.2015 22:58 mhepp | skóre: 22
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
To je pak jasné... Problém vznikl rozdílným přístupem Windows světa a Linux světa ke konci řádku. V Linuxu je to jeden znak (\n) a ve Win jsou to dva (\r\n).

Nejjednodušší rada co s tím je edituj v linuxu co linuxu jest a ve windows co windows jest...

Josef Kufner avatar 5.8.2015 00:03 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Odpovědět | | Sbalit | Link | Blokovat | Admin
Používám toto:
#!/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í.
Hello world ! Segmentation fault (core dumped)
5.8.2015 00:25 nobody
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
hele nechci ti do toho kecat, ale co ti prijde elegantnejsi ? ;)
exiftool -d "%Y-%m-%d" -CreateDate "$f" | awk  '{print $4}'
exiftags "$f" | sed -n '/^Image Created:/s/^[^:]\+: \(....\):\(..\):\(..\).*/\1-\2-\3/p'
Josef Kufner avatar 5.8.2015 11:26 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
d=`exiftool -T -d "%Y-%m-%d" -CreateDate "$f"`
;-)
Hello world ! Segmentation fault (core dumped)
5.8.2015 16:40 nobody
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
d=`exiftool -T -d "%F" -CreateDate "$f"`
;-)
5.8.2015 16:58 jan.xxx
Rozbalit Rozbalit vše Re: Přerovnání souborů do složek
Odpovědět | | Sbalit | Link | Blokovat | Admin
XnView to třeba umí ;-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.