Skillnaden mellan cp -r och cp -R (kopieringskommando)
On februari 18, 2021 by admin cp -r
är tänkt att kopiera filer rekursivt, och cp -R
för att kopiera kataloger rekursivt. Men jag har kontrollerat och båda verkar kopiera både filer och kataloger, samma sak. Så, vad är skillnaden egentligen?
Kommentarer
- Varje omnämnande av dessa alternativ i Linux-manualerna säger att de ’ är synonymer. (De ’ finns inte på några andra unixvarianter.)
Svar
Medan -R
är posix väl definierad, är -r
inte bärbar!
På Linux, i GNU- och BusyBox-implementeringarna av cp
, -r
och -R
är likvärdiga.
På andra sidan, som du kan läsa i POSIX manuell sida för cp
, -r
beteende är implementeringsdefinierat .
* If neither the -R nor -r options were specified, cp shall take actions based on the type and contents of the file referenced by the symbolic link, and not by the symbolic link itself. * If the -R option was specified: * If none of the options -H, -L, nor -P were specified, it is unspecified which of -H, -L, or -P will be used as a default. * If the -H option was specified, cp shall take actions based on the type and contents of the file referenced by any symbolic link specified as a source_file operand. * If the -L option was specified, cp shall take actions based on the type and contents of the file referenced by any symbolic link specified as a source_file operand or any symbolic links encoun- tered during traversal of a file hierarchy. * If the -P option was specified, cp shall copy any symbolic link specified as a source_file operand and any symbolic links encoun- tered during traversal of a file hierarchy, and shall not follow any symbolic links. * If the -r option was specified, the behavior is implementation- defined.
Kommentarer
- En av skillnaderna är att i OSX till exempel
-r
kopierar de riktiga filerna som pekas av symboliska länkar medan-R
kopiera den symboliska länken som är vad den är avsedd för de flesta gånger.
Svar
Små bokstäver -r
var ett äldre alternativ, introducerat i 4.1BSD, som helt enkelt skulle kopiera alla icke-kataloger som filer. Det vill säga om den stötte på en enhet eller FIFO skulle den öppna den, läsa innehållet och skapa en fil på destinationen med innehållet.
versaler -R
var ett standardiserat alternativ (introducerades till BSD i 4.4BSD, även om tidigare versioner hade det som en synonym till -r
) som skulle, när man stöter på en enhet, FIFO eller annan speciell fil, skapa en motsvarande specialfil på destinationen.
Många implementeringar upprätthåller fortfarande denna skillnad, men vissa (inklusive GNU-versionen som är typisk för Linux) tillhandahåller endast -R
semantik, med -r
som synonym.
Svar
Skillnaden är att en använder en gemen ”R” och den andra använder en stor ”R”. Utöver det, ingen skillnad. Samma sak om du använder alternativet --recursive
.
Kommentarer
- Från mansidan: – R, -r, –recursive – kopiera kataloger rekursivt
- @DaveJennings: Bara för att de är likvärdiga på en plattform betyder inte ’ att de är på alla. På vissa implementeringar av
cp
finns det faktiskt en åtskillnad. Se Random832 ’ s svar . @Ignacio du bör inkludera en kvalificering i det här svaret som säger ” om dincp
är den moderna GNU-implementeringen ” eller något liknande. - @Caleb: Frågan är taggad ” linux ”. Vad mer skulle det vara?
- -R och -r ger olika beteende på några av de system jag använder (OS X, FreeBSD, BusyBox coreutils; inte säker på vilka som är just nu). Jag bestämde mig för länge sedan att det var klokt att alltid bara använda
-R
, och i själva verket rekommenderar vissa av man-sidorna i de just nämnda systemen också det.
Svar
I OS X och gamla versioner av FreeBSD -r
är som -R -L --copy-contents
i coreutils, eller det följer symlänkar och läser innehållet i specialfiler och FIFO.
mkdir a;touch b;ln -s $PWD/b a;cp -r a c
ersätter symlänken med målfilen i OS X, mkdir a;mkfifo a/b;cp -r a c
blockeras vid läsning av FIFO och mkdir a;ln -s /dev/zero a;cp -r a b
börjar fylla b/zero
med nollor .
Från cp
man-sidan i OS X och gamla versioner av FreeBSD:
Historic versions of the cp utility had a -r option. This implementation supports that option; however, its use is strongly discouraged, as it does not correctly copy special files, symbolic links, or fifo"s.
I nya versioner av FreeBSD -r
motsvarar -RL
:
Historic versions of the cp utility had a -r option. This implementation supports that option, however, its behavior is different from historical FreeBSD behavior. Use of this option is strongly discouraged as the behavior is implementation-dependent. In FreeBSD, -r is a synonym for -RL and works the same unless modified by other flags. Historical imple- mentations of -r differ as they copy special files as normal files while recreating a hierarchy.
http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html :
--copy-contents
Om du kopierar rekursivt, kopierar du innehållet i alla specialfiler (t.ex. FIFO och enhetsfiler) som om det var vanliga filer. Detta innebär att du försöker läsa data i varje källfil och skriva den till destinationen. Det är vanligtvis ett misstag att använda det här alternativet, eftersom det normalt har oönskade effekter på speciella filer som FIFO och de som vanligtvis finns i katalogen
/dev
.I de flesta fall kommercp -R --copy-contents
att hängas på obestämd tid och försöker läsa från FIFO och specialfiler som/dev/console
, och det fyller på måldisken om du använder den för att kopiera/dev/zero
. Det här alternativet har ingen effekt om du inte kopierar rekursivt och det påverkar inte kopieringen av symboliska länkar.
Svar
en av skillnaderna jag tyckte att -r inte kopiera dolda kataloger medan -R kopiera dolda kataloger.
Jag testade den .git-katalogen i målkatalogen och kom fram till ovanstående slutsats. Jag använder för närvarande centOS.
Jag kan ha fel men det är öppet för diskussion.
Kommentarer
- Jag don ’ t se detta på CentOS 5;
-r
och-R
båda kopierar dolda kataloger
Lämna ett svar