Comando cp: copiando correctamente os cartafoles de ficheiros en *nix

Comando cp: copiando correctamente os cartafoles de ficheiros en *nix

Este artigo revelará algunhas cousas non obvias relacionadas co uso de comodíns ao copiar, comportamento de comando ambiguo cp ao copiar, así como métodos que che permiten copiar correctamente un gran número de ficheiros sen saltar nin fallar.

Digamos que necesitamos copiar todo desde o cartafol /source ata o cartafol /target.

O primeiro que se me ocorre é:

cp /source/* /target

Corrixemos inmediatamente este comando para:

cp -a /source/* /target

Clave -a engadirá copia de todos os atributos, dereitos e engadirá recursividade. Cando non se require a reprodución exacta dos dereitos, abonda cunha chave -r.

Despois de copiar, descubriremos que non se copiaron todos os ficheiros: ficheiros que comezan cun punto como:

.profile
.local
.mc

e similares.

Por que pasou isto?

Porque os comodíns son procesados ​​polo shell (bash nun caso típico). De xeito predeterminado, bash ignorará todos os ficheiros que comezan por puntos, xa que os trata como ocultos. Para evitar este comportamento teremos que cambiar o comportamento bash usando o comando:

shopt -s dotglob

Para asegurarse de que este cambio de comportamento persiste despois dun reinicio, pode crear un ficheiro wildcard.sh con este comando no cartafol /etc/profile.d (Quizais a súa distribución teña un cartafol diferente).

E se non hai ficheiros no directorio de orixe, entón o shell non poderá substituír nada en lugar do asterisco, e a copia tamén fallará cun erro. Hai opcións contra esta situación failglob и nullglob. Teremos que configurar failglob, o que impedirá que se execute o comando. nullglob non funcionará, xa que converte unha cadea con comodíns que non atopou coincidencia nunha cadea baleira (longitude cero), que para cp provocará un erro.

Non obstante, se hai miles de ficheiros ou máis no cartafol, entón o enfoque de comodíns debería abandonarse por completo. O feito é que bash expande os comodíns nunha liña de comandos moi longa como:

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

Hai un límite na lonxitude da liña de comandos, que podemos descubrir usando o comando:

getconf ARG_MAX

Obteña a lonxitude máxima da liña de comandos en bytes:

2097152

Ou:

xargs --show-limits

Temos algo así como:

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

Entón, imos prescindir dos comodíns por completo.

Escribamos só

cp -a /source /target

E aquí estamos ante unha ambigüidade de comportamento cp. Se o cartafol /target non existe, obteremos o que necesitamos.

Non obstante, se existe o cartafol de destino, os ficheiros copiaranse no cartafol /target/source.

Non sempre podemos eliminar o cartafol /target con antelación, xa que pode conter ficheiros que necesitemos e o noso obxectivo, por exemplo, é complementar os ficheiros en /target con ficheiros de /source.

Se os cartafoles de orixe e destino tiñan o mesmo nome, por exemplo, estabamos copiando de /source a /home/source, entón poderiamos usar o comando:

cp -a /source /home

E despois da copia, os ficheiros de /home/source completaríanse con ficheiros de /source.

Este é un problema lóxico: podemos engadir ficheiros no directorio de destino se os cartafoles teñen o mesmo nome, pero se son diferentes, entón o cartafol de orixe colocarase dentro do destino. Como copiar ficheiros de /source a /target usando cp sen comodíns?

Para sortear esta limitación daniña, usamos unha solución non obvia:

cp -a /source/. /target

Os que están familiarizados con DOS e Linux xa o entenderon todo: dentro de cada cartafol hai 2 cartafoles invisibles "". e “..”, que son ligazóns de pseudocarpeta aos directorios actuais e superiores.

  • Ao copiar cp comproba a existencia e intenta crear /target/.
  • Este directorio existe e é /target
  • Os ficheiros de /source son copiados correctamente en /target.

Entón, colgalo nun marco atrevido na túa memoria ou na parede:

cp -a /source/. /target

O comportamento deste comando é claro. Todo funcionará sen erros, independentemente de se tes un millón de ficheiros ou ningún.

Descubrimentos

Se precisa copiar todo ficheiros dun cartafol a outro, non usamos comodíns, é mellor usalos no seu lugar cp combinado cun punto ao final do cartafol de orixe. Isto copiará todos os ficheiros, incluídos os ocultos, e non fallará con millóns de ficheiros ou con ningún ficheiro.

Posterior

vmspike suxeriu unha versión do comando cun resultado similar:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

NOTA: letra maiúscula T ten o significado. Se o mesturas, obterás un lixo completo: a dirección de copia cambiará.
Grazas:

  • Empresas RUVDS.COM por apoio e a oportunidade de publicar no teu blog en Habré.
  • Por imaxe Concepto triple. A imaxe é moi grande e detallada, pódese abrir nunha xanela separada.

PS Envía calquera erro que observes nunha mensaxe privada. Aumento o meu karma por iso.

Comando cp: copiando correctamente os cartafoles de ficheiros en *nix

Fonte: www.habr.com

Engadir un comentario