Specifikus fájltípus másolása a mappaszerkezet megtartásával
On február 10, 2021 by adminVan egy mappastruktúrám, amelyen egy csomó * .csv fájl van szétszórva a mappákban. Most az összes * .csv fájlt át akarom másolni egy másik rendeltetési helyre, megtartva a mappastruktúrát.
Ez a következő módon működik:
cp --parents *.csv /target cp --parents */*.csv" /target cp --parents */*/*.csv /target cp --parents */*/*/*.csv /target ...
és így tovább, de egy parancs használatával szeretném megtenni.
Válasz
find
nagyon praktikus -exec
opcióval rendelkezik:
find . -name "*.csv" -exec cp --parents \{\} /target \;
megjegyzések
- Valószínűleg emiatt \ {\} \;
-
'{}'
ugyanolyan jól működik - Annak ellenére, hogy
-execdir
biztonságosabb, mint a-exec
, ha egyszerűen kicseréljük az egyiket a másikra, akkor a mappaszerkezet nem marad meg a rendeltetésszerűen. get message ‘ A ‘ könyvtár kihagyása, amikor megpróbálom másolni őket a parancsoddal? - Meg tudnád magyarázni, miért a zárójeleket itt el kell kerülni?
Válasz
Használhatja a következőt is: rsync
ezt.
$ rsync -a --prune-empty-dirs --include "*/" --include "*.csv" --exclude "*" source/ target/
Ha üres könyvtárakat szeretne megtartani a forrásfából, hagyja ki a --prune-empty-dirs
lehetőséget:
$ rsync -a --include "*/" --include "*.csv" --exclude "*" source/ target/
Ha nem szeretné megőrizni a hivatkozásokat, a módosítási dátumokat, a fájlengedélyeket, a tulajdonosokat stb., kérjük, cserélje ki a -a
a -rlptgoD
másik kombinációjával. 😉
Megjegyzések
Válasz
Használhatja a keresést és cpio átmeneti módban
find . -name "*.csv" | cpio -pdm /target
Ez megtalálja az összes .csv fájlt az aktuális könyvtárban és az alatta, és másolja őket a / target könyvtárba, fenntartva a .
gyökerű könyvtárstruktúrát.
Ha a következőt használja:
find /path/to/files -name "*.csv" | cpio -pdm /target
az összes fájlt megtalálja a /path/to/files
és az alábbiakban, és átmásolja őket a /target/path/to/files
és az alábbiak közé. .
Megjegyzések
- Az összes választ kipróbáltam fentről lefelé, és csak ez működött az első próbálkozáson
- Ennek kell lennie az elfogadott válasznak.
- Hasznosnak találtam a GNU dokumentumokat : ” Copy-pass módban [a
-p
opció által kért, cpio] beolvassa a másolni kívánt fájlok listáját a standard bemenetből; a könyvtár, ahová átmásolja őket, nem opcionális argumentumként szerepel. ” … ” -d Hozzon létre vezető könyvtárakat, ahol szükséges. ” … ” -m Az előző fájlmódosítási idők megtartása fájlok létrehozásakor. ”
Válasz
A cp
parancs többféle argumentumot engedélyez:
cp **/*.csv --parents ../target
CAVEAT: I itt rekurzív globust használok; ez a globstar
opció a Bash 4+ és ksh
, és alapértelmezés szerint támogatott a zsh
fájlban. Rekurzív globusok nem egyezik a rejtett fájlokkal és mappákkal, és a egyes megvalósítások szimbolikus linkeket követnek, míg mások nem .
Ha a héj nem ” t supp ort rekurzív gömbök, vagy ha nem szeretné használni őket, akkor a következőket teheti:
-
*.csv */*.csv */*/*.csv */*/*/*.csv
– ez természetesen nagyon felesleges, és meg kell tudni, milyen mély a könyvtárstruktúrája. -
$(find . -name "*.csv")
– Ez a egyezik a rejtett fájlokkal és mappákkal. Afind
szintén támogatja annak megadását, hogy követik-e a szimbólum linkeket, amelyek hasznosak lehetnek.
Megjegyzések
- pontosan ezt próbáltam ki (a rekurzív gömb), és talált néhányat, de nem mindent? elég furcsa. Ugyanezt a pontos eredményt kaptam az npm copyfiles szkript használatakor, de ha a find parancsot használom, akkor mindent megtalál …
- @Randyaa ‘ szükségem lesz valamire további részletek arról, hogy pontosan mely fájlokat találtuk ‘ a segítségedre. itt találja a folytatást, és folytathatja a itt a rekurzív glob pontos viselkedéséről folytatott vitát .
- kiderül, hogy a rekurzív glob globálisan nem volt ‘ engedélyezve valamilyen okból …Én ‘ még soha nem futottam ilyenben, de kijavítottam egy
shopt -s globstar
végrehajtásával, közvetlenül a parancsom előtt, és minden rendben van. Köszönöm a nyomon követést! -
--parents
volt az, amit kerestem. köszönöm
Válasz
Ez nekem bevált:
find -name "*.csv" | xargs cp --parents -t /target
Megjegyzések
- A legjobb válasz a legegyszerűbb szintaxissal. Remekül működik és könnyen megjegyezhető. Sok esetben a
find [things] | xargs [do stuff]
nagyon hatékony. - Egyetértett. Nagyon egyszerű a többi válaszhoz képest.
- Megszakad, ha szóközök vannak a fájlnevekben
- @MichelePiccolini A fájlnevekben lévő szóközök kezelhetők az
find -print0
ésxargs -0
.
Válasz
Feladó rsync
“s oldal:
-R, –relative
Használjon relatív elérési utakat. Ez azt jelenti, hogy a parancssorban megadott teljes elérési utak nevét a szervernek küldik, nem csak a fájlnevek utolsó részeit. Ez különösen akkor hasznos, ha egyszerre több különböző könyvtárat szeretne elküldeni. Például, ha ez a parancs:
rsync -av /foo/bar/baz.c remote:/tmp/
… ez egy baz.c nevű fájlt hoz létre a távoli gépen a / tmp / fájlban. Ha ehelyett a
rsync -avR /foo/bar/baz.c remote:/tmp/
akkor egy /tmp/foo/bar/baz.c nevű fájl jön létre a távoli gépen, megőrizve annak teljes elérési útját. Ezeket az extra útelemeket ” impli szerkesztett könyvtárak “(azaz a “foo” és a “foo / bar” könyvtárak a fenti példában).
Tehát ez is működne:
rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
Megjegyzések
- Köszönjük, hogy megadta ezt a választ. Kompatibilis a BSD felhasználói országokkal (macOS), a szóközökkel ellátott és útvonalakkal.
Válasz
Feltételezve, hogy ezt a struktúrát le kívánja másolni ./source
-ről ./destination
-re:
cd source find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)
Felkészültem arra, hogy ezt egy sornak számítsam, a cd source
egy beépített shell.
Megjegyzések
-
tar
rendelkezik a-C
opcióval, hogy ne kelljen először megváltoztatnia a könyvtárat.
-m
a--prune-emty-dirs
.-R
opció hozzáadható a forrás szülőkönyvtár-szerkezetének másolásához. (vö. itteni válaszommal.)