Portál AbcLinuxu, 7. května 2025 21:45

Dotaz: Zkopírování vybraných adresářů, včetně nadřazeného adresáře

Beetljuice avatar 7.6.2010 10:13 Beetljuice | skóre: 26 | blog: BeetljuiceBlog | Bílina
Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Přečteno: 305×
Odpovědět | Admin
Zdravim.Nadpis je asi trochu krkolomný.Jde mi o toto :
Mám velký adresář s daty zákazníků a některé adresáře obsahují podadresář dokumentace.Potřebuji najít které adresáře obsahují ten podadr. "dokumentace" a zkopírovat včetně obsahu do cílového umístění.
Zkoušel jsem to pomocí find a exec cp, ale nevím jak tam dostat ten nadřazený adresář.
Příklad :
výsledek hledání :
data/a/dokumentace
data/b/dokumentace
data/e/dokumentace
data/k/dokumentace
zkopírovat do cíle:
cíl/a/dokumentace
cíl/b/dokumentace
cíl/e/dokumentace
cíl/k/dokumentace
Možná jsem hledal špatně, ale na podobný požadavek jsem dotaz nikde nezahlédl.Díky.
Aj dont spík ÍÍngliš :-(

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.6.2010 11:06 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Odpovědět | | Sbalit | Link | Blokovat | Admin
Treba takhle? Urcite to jde i lepe. Tohle je jen rychly hack. Rozhodne to neni hezke ani optimalni :-)

cd data
for dir in * ;
do
if [ -d $dir ] && [ -d ${dir}/dokumentace ]
  then
    # vlastni kopirovani dat
    mkdir -p ../cil/${dir}/dokumentace
    cp ${dir}/* ../cil/${dir}
    cp ${dir}/dokumentace/* ../cil/${dir}/dokumentace
fi
done
7.6.2010 13:15 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
cp ${dir}/dokumentace/* ../cil/${dir}/dokumentace
Jestli jsou pod tim adresarem 'dokumentace' jeste dalsi podadresare, tak lze pochopitelne pouzit:
cp -r ${dir}/dokumentace ../cil/${dir}/dokumentace
7.6.2010 13:20 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
cp -r ${dir}/dokumentace ../cil/${dir}/dokumentace
Omlouvam se, ma byt cp -r ${dir}/dokumentace ../cil/${dir}
7.6.2010 11:33 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Odpovědět | | Sbalit | Link | Blokovat | Admin
Přes find a scriptik co to zavolá by to určitě šlo lehce.
Ale pomocí tohoto postupu to jde taky:
cd /cesta/k/data
find . -maxdepth 2 -type d -regex ".*/dokumentace$" -exec  mkdir -p "/cesta/k/cil/{}" \;
find . -maxdepth 2 -type d -regex ".*/dokumentace$" -exec  cp -r "{}" "/cesta/k/cil/{}" \;
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
7.6.2010 12:08 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
No nevim, ale s timhle resenim bych mel hned nekolik problemu:
  1. proleza cely adresar 2x
  2. najde i adresar data/dokumentace (coz se nechce)
  3. nekopiruje soubory v adresari data/X
  4. adresar data/X/dokumentace kopiruje do cil/X/dokumentace/dokumentace
7.6.2010 13:46 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
OK, sorry - nezkusil jsem si to :)

ad. 1 - to by snad až tak nevadilo, pokud to není několik set tisíc položek :)
ad. 2, ad. 3, ad. 4 - oprava:
cd /cesta/k/data
find . -maxdepth 2 -type d -regex "\.\/.*/dokumentace$" -exec  mkdir -p "/home/imega/cil/{}" \;
find . -maxdepth 2 -type d -regex "\.\/.*/dokumentace$" -exec  cp -r "{}/../" "/home/imega/cil/{}/../" \;
Osobně bych to realizoval přes find, který by přes -exec volal skript, kde by se akce realizovaly.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
7.6.2010 13:51 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
/home/imega má být /cesta/k – aspoň je vidět, že jsem si to i zkusil :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
7.6.2010 14:13 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Si mas vytvorit testovaci adresar a pod nim nejakou adresarovou strukturu pro pokusy :-)

Ja to delam takhle:
mkdir testovaci_adresar/data
cd testovaci_adresar/data
mkdir -p a/dok; touch a/soub1 a/dok/soub2
touch b
mkdir  c; touch c/soub3
mkdir -p d/dok ; touch d/soub4 d/dok/soub5
touch e
Tim jsem si vytvoril smes souboru a adresaru ruznych urovni a na nich si pak delam pokusy ;-)
7.6.2010 15:19 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
A pointa? - však jsem si to udělal…
PS: já mám testovací mašinu…
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
7.6.2010 15:34 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
A pointa?
Nebudes davat do verejnych diskuzi jedno platne prihlasovaci jmeno na tvuj system. To je takova zakladni ochrana proti crackerum, kteri se chteji probourat na tvuj system.
7.6.2010 18:40 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
„Security by obscurity“ je „základní ochrana“ - to asi ne, že ? :)
I když jsem z hlediska bezpečnosti paranoidní, tak znalost běžného uživatele neveřejného testovacího serveru mě opravdu netrápí.
Kolik je asi tak kulturních variant běžných uživatelských účtů pokud znáte jméno a příjmení (což u mě není problém zjistit) :)
<joke>Ale začnu uvažovat o přejmenování root-a </joke>
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
Fuky avatar 7.6.2010 12:54 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Odpovědět | | Sbalit | Link | Blokovat | Admin
$ find . -type d -name 'dokumentace' -printf '%h\n' |xargs -i cp -a {} cil
-- RÁMO: psí tábor , ETriatlon: Výuka plavání
7.6.2010 13:11 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
  1. najde i jine adresare 'dokumentace' nez pouze v druhe urovni
  2. kopiruje data/X/ do cil/ (tedy ne do cil/X)
  3. kopiruje i jine podadresare nez jenon "dokumentace" (coz tazatel zrejme chtel)
Beetljuice avatar 7.6.2010 13:26 Beetljuice | skóre: 26 | blog: BeetljuiceBlog | Bílina
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
JJ zdroj a cíl si upravím, ale bohužel to kopíruje i jiné adresáře než jen tu dokumentaci. A já chci jen tu dokumentaci ;-)
Aj dont spík ÍÍngliš :-(
7.6.2010 13:31 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Ten muj skript z prvniho prispevku funguje. Zkousel jsem to tady u sebe.

Tohle reseni s findem by bylo efektivnejsi, problem ale je, ze 'cp' nejde dost dobre vysvetlit, aby kopirovalo jen adresar a ostatnich si nevsimalo, takze stejne by to clovek musel udelat tak, jak to mam v tom prvnim skriptu - nejdrive zkopirovat adresar a pak jenom ten podadresar.

Pokud nekdo neprijde na to, jak jednoduse udelat neco jako: cp /data/a{./dokumentace} cil/a, tak se nehneme z mista.
7.6.2010 13:36 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
cp /data/a{./dokumentace} cil/a
Sakra, zase preklep :-( Ma byt carka misto tecky ve slozenych zavorkach.

cp /data/a{,/dokumentace} cil/a
Beetljuice avatar 7.6.2010 14:11 Beetljuice | skóre: 26 | blog: BeetljuiceBlog | Bílina
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
JJ ten tvůj skript vypadá myslím dobře. Funguje ;-) Ještě doplním pár věcí, ale ty nejsou předmětem dotazu. Moc dík za pomoc. :-)
A ano zapomněl jsem, že i v adresáři "dokumentace" jsou podadresáře nutně ke kopírování, ale to řeší přepínač "-r"
Aj dont spík ÍÍngliš :-(
7.6.2010 14:23 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Reseni s "cp -r" tam mam taky :-) Jen jeste v takovem pripade muzes nahradit to mkdir -p ../cil/${dir}/dokumentace jenom mkdir ../cil/$dir
Moc dík za pomoc
Neni zac.
7.6.2010 13:34 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
3. kopiruje i jine podadresare nez jenon "dokumentace" (coz tazatel zrejme chtel)
Ma byt samozrejme "NEchtel".
Fuky avatar 7.6.2010 17:37 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře

Zadání není jednoznačné, takže se lze jen domnívat co tazatel přesně chtěl. ;-)

kopiruje data/X/ do cil/ (tedy ne do cil/X)

Kopíruje data/X do cil, tj. v adresáři cíl bude podadresář X čili kopíruje data/X/ do cil/X, vyzkoušej si co dělá:

$ cp -a data/X cil

kopiruje i jine podadresare nez jenon "dokumentace"

Tak kopírujte jen podadresář dokumentace:

$ find . -type d -name 'dokumentace' |xargs -i rsync -aR {} cil

najde i jine adresare 'dokumentace' nez pouze v druhe urovni

Tak si specifikujte v jaké úrovni budete adresář dokumentace zpracovávat:

$ find . -mindepth 3 -maxdepth 3 -type d -name 'dokumentace' |xargs -i rsync -aR {} cil

Ještě nějaká nejasnost?

Beetljuice avatar 8.6.2010 09:33 Beetljuice | skóre: 26 | blog: BeetljuiceBlog | Bílina
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Ačkoliv je to psáno trochu kostrbatě, myslím si, že podstata požadavku je napsána již ve vzoru dotazu.
Najít data "dokumentace" a zkopírovat do cíle, ale :
- adresář dokumentace má nadřazený adresář (zákazník), který se musí také vytvořit v cíli, aby bylo jasné ke komu to vlastně patří.
- pokud adresář dokumentace obsahuje i další podadresáře, tak ty také zkopírovat (to jsem v původním dotazu zapomněl zmínit) ;-)
Aj dont spík ÍÍngliš :-(
8.6.2010 10:57 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Kopíruje data/X do cil, tj. v adresáři cíl bude podadresář X čili kopíruje data/X/ do cil/X, vyzkoušej si co dělá:
Ano, popletl jsem to.

Pomotal jsem
cp -r data/x cil
a
cp -r data/x/* cil
7.6.2010 13:41 marek
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dobry den.

Pochopil jsem to dobre?

~/zkouska$ find
.
./bleble
./bleble/dokumentace
./bleble/dokumentace/zkouska
./blabla
./bloblo
./bloblo/bubu
./bloblo/dokumentace
./bloblo/dokumentace/zkouska
~/zkouska$ cp --parents */dokumentace/* ../zkouska1/
~/zkouska$ find ../zkouska1/
../zkouska1/
../zkouska1/bleble
../zkouska1/bleble/dokumentace
../zkouska1/bleble/dokumentace/zkouska
../zkouska1/bloblo
../zkouska1/bloblo/dokumentace
../zkouska1/bloblo/dokumentace/zkouska
Marek
7.6.2010 14:03 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Ten prepinac "--parents" je prinos do zdejsi diskuze.

Problem s tim tvym skriptem je, ze nekopiruji soubory v adresari v prvni urovni, tzn. ze soubory z napr. ./zkouska/bleble se nezkopiruji do ../zkouska1/bleble. To je ta velka zaludnost tohoto dotazu - zkopirovat obsah (tj.soubory) adresare a JEDNOHO jeho podadresare.

Taky se asi nebude kopirovat stromova struktura v adresari 'dokumentace', ale to se puvodni tazatel nevyjadril, jestli se tam nejaka ocekava.
7.6.2010 14:34 marek
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Dobry den

" ./zkouska/bleble se nezkopiruji do ../zkouska1/bleble."

A ma se kopirovat, nebo ne?

Toto

cp -r --parents */dokumentace/* ../zkouska1/

podle mne dela:

Pokud existuje adresar dokumentace ve druhe urovni, tak ho zkopiruji i s nadrizenym adresarem rekurzivne do ./zkouska1/

Marek
7.6.2010 15:14 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
A ma se kopirovat, nebo ne?
Myslim, ze tazatel se vyjadril, ze ma.

Zkousel jsi, co ten tvuj 'cp' kopiruje? Protoze ja to zkousel a nekopiruje tu prvni uroven.

Vytvor si soubor v zkouska/bleble (napr. takhle: touch ./zkouska/bleble/abc), spust na to ten tvuj cp a podivej se, co mas v zkouska1/bleble. Soubor 'abc' to rozhodne nebude :-)

To stejne plati pro soubory (i adresare) v ./zkouska/bleble/dokumentace/zkouska

DIR="./zkouska/bleble/dokumentace/zkouska"
touch ${DIR}/def
mkdir ${DIR}/podadr
touch ${DIR}/podadr/ghi
^^ Ani jeden z nich se nezkopiruje.
7.6.2010 15:25 marek
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře

Co tedy delam spatne, ze si myslym, ze mne to funguje?

~/zkouska$ DIR="./bleble/dokumentace/zkouska"
~/zkouska$ mkdir ./bleble/dokumentace/zkouska
~/zkouska$ touch ${DIR}/def
~/zkouska$ mkdir ${DIR}/podadr
~/zkouska$ touch ${DIR}/podadr/ghi
~/zkouska$ find
.
./bleble
./bleble/dokumentace
./bleble/dokumentace/zkouska
./bleble/dokumentace/zkouska/podadr
./bleble/dokumentace/zkouska/podadr/ghi
./bleble/dokumentace/zkouska/def
./blabla
./bloblo
./bloblo/bubu
./bloblo/dokumentace
./bloblo/dokumentace/dir
./bloblo/dokumentace/dir/file
./bloblo/dokumentace/zkouska
~/zkouska$ mkdir ../zkouska1
~/zkouska$ cp -r --parents */dokumentace/* ../zkouska1/
~/zkouska$ find ../zkouska1
../zkouska1
../zkouska1/bleble
../zkouska1/bleble/dokumentace
../zkouska1/bleble/dokumentace/zkouska
../zkouska1/bleble/dokumentace/zkouska/podadr
../zkouska1/bleble/dokumentace/zkouska/podadr/ghi
../zkouska1/bleble/dokumentace/zkouska/def
../zkouska1/bloblo
../zkouska1/bloblo/dokumentace
../zkouska1/bloblo/dokumentace/dir
../zkouska1/bloblo/dokumentace/dir/file
../zkouska1/bloblo/dokumentace/zkouska
Marek
7.6.2010 15:42 Ant
Rozbalit Rozbalit vše Re: Zkopírování vybraných adresářů, včetně nadřazeného adresáře
Co tedy delam spatne, ze si myslim, ze mne to funguje?
Zapomnel jsi si vytvorit ten soubor v ./bleble jak jsem psal (touch ./bleble/abc)

Jinak se omlouvam, ze jsem nepostrehl to pridani prepinace "-r" do "cp". Tim se resi to kopirovani adresarove struktury pod 'dokumentace'.

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.