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
-
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.
-
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)
find /folder/org -type f -exec cp --force --backup=numbered '{}' /folder/copy \;
-
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)
-
find /home/vasek/obrazky /home/vasek/videa -type f -exec cp --force --backup=numbered '{}' /folder/copy \;
-
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?
-
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.
-
Tenhle bastl taky funguje. :-[ ;D
Cesty jsou nastaveny tak, ze se soubory kopiruji z aktualniho do nadrazeneho adresare.
#!/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
-
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.
-
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.
#!/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!
-
nebo třeba takhle (používá mktemp na vytvoření jedinečného jména souboru)
#! /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