Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: vasicekabc 10 Prosince 2011, 19:39:38

Název: Jak správně sestavit příkaz
Přispěvatel: vasicekabc 10 Prosince 2011, 19:39:38
Potřeboval bych z nějaké rozsáhlejší adresářové struktury jednoduše zkopírovat všechny soubory do jediného adresáře.

Konkrétně se jedná o fotky a videa, které mám detailně roztříděné do složek, ale potřeboval bych kopii všech těchto souborů v jediném adresáři.

Jako začátečník nevím, jak takový příkaz sestavit, a aby také bylo ošetřeno, že pokud budou mít dva soubory stejný název, jeden z nich se přejmenuje.
Název: Re:Jak správně sestavit příkaz
Přispěvatel: daysleeper 10 Prosince 2011, 20:25:35
Nautilus (http://wiki.ubuntu.cz/Nautilus)
 - najet do daného adresáře
 - kliknout na "hledat soubory"
 - do vyhledávacího pole zadat filtr, nebo jen mezeru a Enter
 - rozkliknout ikonku "+" a přidat další filtr (videa apod.)
 - označit soubory a dát zkopírovat

Terminál (http://wiki.ubuntu.cz/Termin%C3%A1l)
Kód: [Vybrat]
find /folder/org -type f -exec cp --force --backup=numbered '{}' /folder/copy \;
Název: Re:Jak správně sestavit příkaz
Přispěvatel: vasicekabc 10 Prosince 2011, 22:28:19
To je přesně ono, to řešení v příkazové řádce jsem hledal.

Děkuji moc

Jen bych ještě poprosil: jak ten příkaz poupravit, pokud bych chtěl vstupních složek více? (např /home/vasek/obrazky i /home/vasek/videa)
Název: Re:Jak správně sestavit příkaz
Přispěvatel: daysleeper 10 Prosince 2011, 22:38:58
Kód: [Vybrat]
find /home/vasek/obrazky /home/vasek/videa -type f -exec cp --force --backup=numbered '{}' /folder/copy \;
Název: Re:Jak správně sestavit příkaz
Přispěvatel: vasicekabc 12 Prosince 2011, 08:20:47
Ještě poslední zádrhel: soubory stejného jména tento příkaz přejmenuje tak, že nakonec přidá ~1~
např.: z P4070030.JPG udělá P4070030.JPG.~1~
Bohužel, v této podobě soubor třeba prohlížeč obrázků a jiné grafické aplikace nedokáží otevřít.
Nešlo by nějek zařídit, aby se ono číslování přidávalo za jméno souboru, nikoli až za typ?
Název: Re:Jak správně sestavit příkaz
Přispěvatel: Luban 12 Prosince 2011, 12:27:57
Fotky při stahování automaticky přejmenovávám podle dat z exifu na RRRRMMDD_HHMMSS.jpg. Pravděpodobnost totožných názvů je minimální. Pokud vaše fotky exif mají, asi byl volil nejdříve nejaký script na přejmenování a potom na sesypání do adresáře.
Název: Re:Jak správně sestavit příkaz
Přispěvatel: Uran 12 Prosince 2011, 17:01:50
Tenhle bastl taky funguje.  :-[ ;D
Cesty jsou nastaveny tak, ze se soubory kopiruji z aktualniho do nadrazeneho adresare.

Kód: [Vybrat]
#!/bin/bash
find . -type f | while read F # najde vsechny soubory
do if [ -e "`echo ../"${F##*/}"`" ] # otestuje jestli soubor uz v cilovem adresari neexistuje
then cp "$F" "`echo "${F##*/}" | sed 's#\.#_1\.#' | sed 's#^#\.\./#'`" # jestlize je soubor v cilovem adresari pritomen tak mezi priponu a nazev nove kopirovaneho souboru umisti "_1"
else cp "$F" "`echo ../"${F##*/}"`" # jestli neni tak ho normalne skopiruje
fi
done
Název: Re:Jak správně sestavit příkaz
Přispěvatel: vasicekabc 12 Prosince 2011, 18:58:12
Luban: Právě že o kompletně utříděnou sbírku fotek a pojmenovanou dle dat z exifu jsem vlastní blbostí přišel. Teď jsem ty fotky posehnal zpět z různých zdrojů a chci sbírku znovu sestavit. Bohužel, některé snímky data v exifu nemají, nebo je mají pozměněné. Stejně tak dva totožné názvy neznamenají, že se jedná o stejné fotografie.

Uran: Buď mi ta věc nefunguje, nebo spíš nevím jak ji použít. Kód jsem vložil do prázdného souboru ve složce obsahující všechny složky s obrázky. Soubor označil jako spustitelný a spustil. nejprve mi to hlásilo, že skopiruje není příkaz, tak jsem před tento komentář vložil křížek, nyní to nedělá nic.
Název: Re:Jak správně sestavit příkaz
Přispěvatel: Uran 12 Prosince 2011, 20:59:00
Tak tohle je cistci reseni a pocitato i stim, ze duplicitnich fotek bude i vic nez 1.
Skript se spousti ve slozce a soubory to prekopiruje a prejmenuje do nadrazene slozky. Jen asi neni ostrena situace kdy je v puvodnich fotkach v nazvu ~.
Spoustim to v terminalu a vypada to, ze to funguje.

Kód: [Vybrat]
#!/bin/bash
find . -type f -exec cp --force --backup=numbered '{}' ../ \;

find ../ -type f -iname '*~*' | while read F
do G=`echo "${F%.*}"`
mv "$F" "`echo "${G%.*}""${F##*.}"."${G##*.}"`"
done

Edit: skript nijak neresi situaci kdy se na stejne (aktualni slozce) spusti znovu!
Název: Re:Jak správně sestavit příkaz
Přispěvatel: daysleeper 12 Prosince 2011, 23:46:33
nebo třeba takhle (používá mktemp na vytvoření jedinečného jména souboru)
Kód: [Vybrat]
#! /bin/bash

org=/tmp/org
copy=/tmp/copy

if [[ ! -d "$copy" ]] || [[ ! -w "$copy" ]]; then
echo "error: problem with $copy" >&2
exit 1
fi

find "$org" -type f | while read F; do
name="$(basename "$F")"
if [[ -e "$copy/$name" ]]; then
suf=${name##*.}
if [[ "$suf" != "$name" ]]; then
cp_name="$(mktemp "${copy}/${name%.${suf}}_XXXXXX.${suf}")"
else
cp_name="$(mktemp "${copy}/${name}_XXXXXX")"
fi

cp -v "$F" "$cp_name"
else
cp -v "$F" "$copy"
fi
done

exit 0