Portál AbcLinuxu, 7. května 2025 21:45
find
a exec cp
, ale nevím jak tam dostat ten nadřazený adresář.data/a/dokumentace data/b/dokumentace data/e/dokumentace data/k/dokumentacezkopírovat do cíle:
cíl/a/dokumentace cíl/b/dokumentace cíl/e/dokumentace cíl/k/dokumentaceMožná jsem hledal špatně, ale na podobný požadavek jsem dotaz nikde nezahlédl.Díky.
Řešení dotazu:
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
cp ${dir}/dokumentace/* ../cil/${dir}/dokumentaceJestli jsou pod tim adresarem 'dokumentace' jeste dalsi podadresare, tak lze pochopitelne pouzit:
cp -r ${dir}/dokumentace ../cil/${dir}/dokumentace
find
a scriptik co to zavolá by to určitě šlo lehce.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/{}" \;
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.
/home/imega
má být /cesta/k
– aspoň je vidět, že jsem si to i zkusil :)
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 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.
$ find . -type d -name 'dokumentace' -printf '%h\n' |xargs -i cp -a {} cil
cp /data/a{./dokumentace} cil/a
, tak se nehneme z mista.
cp /data/a{./dokumentace} cil/aSakra, zase preklep
cp /data/a{,/dokumentace} cil/a
-r
"
mkdir -p ../cil/${dir}/dokumentace
jenom mkdir ../cil/$dir
Moc dík za pomocNeni zac.
3. kopiruje i jine podadresare nez jenon "dokumentace" (coz tazatel zrejme chtel)Ma byt samozrejme "NEchtel".
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?
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 cila
cp -r data/x/* cil
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/zkouskaMarek
" ./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/
MarekA 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
DIR="./zkouska/bleble/dokumentace/zkouska"
touch ${DIR}/def
mkdir ${DIR}/podadr
touch ${DIR}/podadr/ghi
^^ Ani jeden z nich se nezkopiruje.
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/zkouskaMarek
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'.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.