Kopioi tietty tiedostotyyppi pitämällä kansiorakenne
On helmikuu 10, 2021 by adminMinulla on kansiorakenne, jossa on joukko * .csv-tiedostoja hajallaan kansioissa. Haluan nyt kopioida kaikki * .csv-tiedostot toiseen kohteeseen säilyttäen kansiorakenteen.
Se toimii seuraavasti:
cp --parents *.csv /target cp --parents */*.csv" /target cp --parents */*/*.csv /target cp --parents */*/*/*.csv /target ...
ja niin, mutta haluaisin tehdä sen yhdellä komennolla.
Vastaa
find
: lla on erittäin kätevä vaihtoehto -exec
:
find . -name "*.csv" -exec cp --parents \{\} /target \;
kommentit
- Luultavasti tämän vuoksi \ {\} \;
-
'{}'
toimii yhtä hyvin - Vaikka
-execdir
on turvallisempi kuin-exec
, pelkän korvaaminen toisella ei säilytä kansiorakennetta aiotulla tavalla. - Miksi minä hae viesti ' Hakemiston jättäminen pois ', kun yritän kopioida ne komennolla?
- Voitteko selittää, miksi aaltosulkeet pitää välttää täältä?
Vastaa
Voit käyttää myös rsync
varten tämä.
$ rsync -a --prune-empty-dirs --include "*/" --include "*.csv" --exclude "*" source/ target/
Jos haluat pitää tyhjät hakemistot lähdepuusta, ohita vaihtoehto --prune-empty-dirs
:
$ rsync -a --include "*/" --include "*.csv" --exclude "*" source/ target/
Jos et et halua, että symlinkit, muokkauspäivät, tiedostojen käyttöoikeudet, omistajat jne. säilytetään, korvaa -a
toisen -rlptgoD
-yhdistelmän kanssa. 😉
kommentit
Vastaa
Voit käyttää etsiä ja cpio läpikulkutilassa
find . -name "*.csv" | cpio -pdm /target
Tämä löytää kaikki .csv-tiedostot nykyisessä hakemistossa ja sen alapuolella ja kopioi ne osoitteeseen / target ylläpitämällä hakemistorakennetta, jonka juuret ovat .
.
Jos käytät
find /path/to/files -name "*.csv" | cpio -pdm /target
se löytää kaiken tiedoston kohdasta /path/to/files
ja alla ja kopioi ne tiedostoon /target/path/to/files
ja alle .
Kommentit
- Yritin kaikkia vastauksia ylhäältä alas asti tähän asti, ja tämä oli ainoa, joka toimi ensimmäisellä yrityksellä
- Tämän pitäisi olla hyväksytty vastaus.
- Minusta GNU-asiakirjat olivat hyödyllisiä: " copy-pass-tilassa [
-p
-vaihtoehdon pyytämä cpio] lukee vakiotulosta kopioitavien tiedostojen luettelon; hakemisto, johon se kopioi ne, annetaan ei-vaihtoehto-argumenttina. " … " -d Luo johtavia hakemistoja tarvittaessa. " … " -m Säilytä aiemmat tiedostomuutosajat kun luot tiedostoja. "
Vastaa
cp
-komento sallii useita lähde argumentteja:
cp **/*.csv --parents ../target
CAVEAT: I ”m käyttämällä tässä rekursiivista palloa; tämä on vaihtoehto globstar
Bash 4+: ssa ja ksh
, ja sitä tuetaan oletuksena kohdassa zsh
. Rekursiiviset maapallot eivät vastaavat piilotettuja tiedostoja ja kansioita, ja jotkut toteutukset seuraavat symboliittiä kun taas toiset eivät .
Jos komentotulkki ei ” t supp ort rekursiiviset maapallot, tai jos et halua käyttää niitä, voit tehdä seuraavan:
-
*.csv */*.csv */*/*.csv */*/*/*.csv
– tämä on tietysti hyvin tarpeeton ja edellyttää, että tiedät kuinka syvälle hakemistorakenne on. -
$(find . -name "*.csv")
– Tämä tulee vastaa piilotettuja tiedostoja ja kansioita.find
tukee myös sen määrittämistä, noudatetaanko symlinkkejä vai ei, mikä voi olla hyödyllistä.
Kommentit
- juuri tätä yritin (rekursiivinen maapallo) ja se löysi joitain, mutta ei kaikkia? melko outo. Sain saman tarkan tuloksen käytettäessä npm copyfiles-komentosarjaa, mutta jos käytän find-komentoa, se löytää kaiken …
- @Randyaa tarvitsen ' tarvitsen joitain lisätietoja siitä, mitä tiedostoja tarkalleen ' ei löytynyt auttamaan sinua. Löydät täältä keskustelun ja jatkat täältä rekursiivisen maapallon tarkasta käytöstä. .
- osoittautui, että rekursiivista maailmaa ei ollut ' käytössä jostain syystä …' En ole koskaan törmännyt tähän ennen, mutta korjasin sen vain suorittamalla
shopt -s globstar
-toiminnon välittömästi ennen komentoni ja kaikki on hyvin. Kiitos seurannasta! - Etsin etsintää
--parents
. kiitos
vastaus
Tämä toimi minulle:
find -name "*.csv" | xargs cp --parents -t /target
Kommentit
- Paras vastaus yksinkertaisimmalla syntaksilla. Toimii hienosti ja on helppo muistaa. Monissa tapauksissa
find [things] | xargs [do stuff]
on erittäin tehokas. - Hyväksytty. Erittäin suoraviivainen joihinkin muihin vastauksiin verrattuna.
- Katkeaa, jos tiedostonimissä on välilyöntejä
- @MichelePiccolini Tiedostonimissä olevia välilyöntejä voidaan käsitellä
find -print0
jaxargs -0
.
Vastaa
Lähettäjä rsync
”s -sivu:
-R, –relative
Käytä suhteellisia polkuja. Tämä tarkoittaa, että komentorivillä määritetyt täydelliset polunimet lähetetään palvelimelle eikä vain viimeisistä tiedostonimien osista. Tämä on erityisen hyödyllistä, kun haluat lähettää useita eri hakemistoja samanaikaisesti. Esimerkiksi, jos käytit tämä komento:
rsync -av /foo/bar/baz.c remote:/tmp/
… tämä luo tiedoston nimeltä baz.c kansioon / tmp / etäkoneeseen. Jos sen sijaan käytit
rsync -avR /foo/bar/baz.c remote:/tmp/
sitten etäkoneelle luodaan tiedosto nimeltä /tmp/foo/bar/baz.c ja säilytetään sen koko polku. Näitä ylimääräisiä polkuelementtejä kutsutaan ” impli ed hakemistot ”(eli ”foo” – ja ”foo / bar” -hakemistot yllä olevassa esimerkissä).
Joten tämä toimisi myös:
rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
Kommentit
- Kiitos vastauksesta. Yhteensopiva BSD-käyttömaan (macOS), ja polkujen kanssa, joissa on välilyöntejä.
Vastaa
Oletetaan, että haluat kopioida tämän rakenteen ./source
– ./destination
:
cd source find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)
Olen valmis laskemaan, että yhtenä rivinä cd source
on sisäänrakennettu kuori.
Kommentit
-
tar
on vaihtoehto-C
, jotta hakemistoa ei tarvitse vaihtaa ensin.
-m
on pikakuvake sivulle--prune-emty-dirs
.-R
-vaihtoehto voidaan lisätä kopioimaan lähteen päähakemistorakenne. (vrt. vastaukseni täällä.)