cp kommando: korrekt kopiering af filmapper i *nix

cp kommando: korrekt kopiering af filmapper i *nix

Denne artikel vil afsløre nogle ikke-indlysende ting relateret til brugen af jokertegn ved kopiering, tvetydig kommandoadfærd cp når du kopierer, samt metoder, der giver dig mulighed for korrekt at kopiere et stort antal filer uden at springe over eller gå ned.

Lad os sige, at vi skal kopiere alt fra /source-mappen til /target-mappen.

Det første der kommer til at tænke på er:

cp /source/* /target

Lad os straks rette denne kommando til:

cp -a /source/* /target

nøgle -a vil tilføje kopiering af alle attributter, rettigheder og tilføje rekursion. Når nøjagtig gengivelse af rettigheder ikke er påkrævet, er en nøgle tilstrækkelig -r.

Efter kopiering vil vi opdage, at ikke alle filer blev kopieret - filer, der starter med en prik som:

.profile
.local
.mc

og lignende.

Hvorfor skete dette?

Fordi jokertegn behandles af skallen (bash i et typisk tilfælde). Som standard vil bash ignorere alle filer, der starter med prikker, da det behandler dem som skjulte. For at undgå denne adfærd bliver vi nødt til at ændre adfærd bash ved hjælp af kommandoen:

shopt -s dotglob

For at sikre, at denne adfærdsændring fortsætter efter en genstart, kan du oprette en wildcard.sh-fil med denne kommando i mappen /etc/profile.d (Måske har din distribution en anden mappe).

Og hvis der ikke er nogen filer i kildemappen, vil skallen ikke være i stand til at erstatte noget i stedet for stjernen, og kopiering vil også mislykkes med en fejl. Der er muligheder mod denne situation failglob и nullglob. Vi bliver nødt til at indstille failglob, hvilket forhindrer kommandoen i at blive udført. nullglob vil ikke fungere, da den konverterer en streng med jokertegn, der ikke fandt en match, til en tom streng (nul længde), som for cp vil forårsage en fejl.

Men hvis der er tusindvis af filer eller flere i mappen, bør jokertegnstilgangen helt opgives. Faktum er, at bash udvider jokertegn til en meget lang kommandolinje som:

cp -a /souce/a /source/b /source/c …… /target

Der er en grænse for længden af ​​kommandolinjen, som vi kan finde ud af ved hjælp af kommandoen:

getconf ARG_MAX

Lad os få den maksimale længde af kommandolinjen i bytes:

2097152

Или:

xargs --show-limits

Vi får noget som:

….
Maximum length of command we could actually use: 2089314
….

Så lad os helt undvære jokertegn.

Lad os bare skrive

cp -a /source /target

Og her står vi over for uklarhed i adfærd cp. Hvis /target-mappen ikke eksisterer, så får vi det, vi har brug for.

Men hvis målmappen eksisterer, kopieres filerne til mappen /target/source.

Vi kan ikke altid slette mappen /target på forhånd, da den kan indeholde filer, vi har brug for, og vores mål for eksempel er at supplere filerne i /target med filer fra /source.

Hvis kilde- og destinationsmappen blev navngivet det samme, for eksempel kopierede vi fra /kilde til /hjem/kilde, så kunne vi bruge kommandoen:

cp -a /source /home

Og efter kopiering ville filerne i /home/source blive suppleret med filer fra /source.

Dette er et logisk problem: vi kan tilføje filer i destinationsmappen, hvis mapperne hedder det samme, men hvis de er forskellige, vil kildemappen blive placeret i destinationen. Hvordan kopierer man filer fra /source til /target ved hjælp af cp uden jokertegn?

For at omgå denne skadelige begrænsning bruger vi en ikke-oplagt løsning:

cp -a /source/. /target

De, der er fortrolige med DOS og Linux, har allerede forstået alt: inde i hver mappe er der 2 usynlige mapper "." og "..", som er pseudo-mapper links til de nuværende og højere mapper.

  • Ved kopiering cp tjekker for eksistens og forsøger at oprette /target/.
  • Sådan en mappe findes, og den er /target
  • Filer fra /source er kopieret til /target korrekt.

Så hæng den i en fed ramme i din hukommelse eller på væggen:

cp -a /source/. /target

Opførselen af ​​denne kommando er klar. Alt fungerer uden fejl, uanset om du har en million filer eller slet ingen.

Fund

Hvis du skal kopiere alle filer fra en mappe til en anden, bruger vi ikke jokertegn, det er bedre at bruge dem i stedet for cp kombineret med et punktum i slutningen af ​​kildemappen. Dette vil kopiere alle filer, inklusive skjulte, og vil ikke fejle med millioner af filer eller slet ingen filer.

efterskrift

vmspike foreslog en kommandoversion med et lignende resultat:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

OBS: brevkasse T har betydningen. Hvis du blander det sammen, vil du få fuldstændig vrøvl: kopieringsretningen ændres.
Tak:

  • selskab RUVDS.COM for støtte og mulighed for at publicere på din blog på Habré.
  • Per billede Tredobbelt koncept. Billedet er meget stort og detaljeret, kan åbnes i et separat vindue.

PS Send venligst eventuelle fejl du bemærker i en privat besked. Jeg øger min karma for dette.

cp kommando: korrekt kopiering af filmapper i *nix

Kilde: www.habr.com

Tilføj en kommentar