28 Nisan 2020 Salı

cp komutu

Giriş
copy anlamına gelir. mv komutu kopyalama yerine taşımak için kullanılabilir. cp komutu çaılırşen Ctrl+C ile kesilse bile sorun çıkmıyor.

cp komutu hedef dosya varsa bile onu uyarı vermeden ezer.

Örnek
Görmek için şöyle yaparız.
$ cp first.html second.html

$ cat second.html
first
-a seçeneği
Açıklaması şöyle.
-a Same as -pPR options. Preserves structure and attributes of files but not directory structure.
Sembolik linkeri de takip eder. 
Örnek
Şöyle yaparız.
cp -a src_dir another_destination/
Örnek
Bir diski başka diske kopyalamak için şöyle yaparız
cp -a /media/external/disk1/. /media/external/disk2/
-n/--no-clobber seçeneği
Hedef dosya varsa onu değiştirmez. Açıklaması şöyle
--no-clobber do not overwrite an existing file
Nasıl çalıştığının açıklaması şöyle. Eğer cp komutu dosyayı yok olarak tespit etse, ve bir sonraki aşamada başka bir uygulama dosyayı yaratsa bir doğru çalışır. Çünkü dosyayı overwrite edecek bayraklar ile açmadğı için hata alır ve dosyayı ezmez.
When --no-clobber is set, it checks whether the destination already exists; if it determines it doesn’t, and it should therefore proceed with the copy, it remembers that it’s supposed to copy to a new file. When the time comes to open the destination file, it opens it with flags which enforce its creation, O_CREAT and O_EXCL; the operating system then checks that the file doesn’t exist while opening it, and fails (EEXIST) if it does.
-p seçeneği
preserve anlamına gelir. dosyaların mode,ownership,timestamp gibi özellikleri muhafaza edilir. Açıklaması şöyle
-p     same as --preserve=mode,ownership,timestamps

   --preserve[=ATTR_LIST]
          preserve the specified attributes (default: mode,ownership,time‐
          stamps), if  possible  additional  attributes:  context,  links,
          xattr, all
Örnek
Şöyle yaparız.
cp --preserve oldfile newfile
Şöyle yaparız.
cp -p oldfile newfile
Örnek
Şöyle yaparız.
cp --preserve=timestamps oldfile newfile
-R/-r seçeneği
recursive anlamına gelir.
Örnek - globbing
Her şeyi kopyalamak için şöyle yaparız
cp -r ~/Documents/* ~/copies # works as expected
Ancak bazı dosyaları kopyalama çalışmıyor
cp -r ~/Documents/*.odt ~/copies # does not work as expected
glob işlemini bash'e bırakarak şöyle yaparız. Burada target ve source directory yer değiştiriyor. Ayrıca "/**/*.odt" kullanabilmek için bash ile recursive glob etkinleştiriliyor. 
shopt -s globstar
cp -nt ~/copies/ ~/Documents/**/*.odt
Eğer çok fazla dosya varsa şöyle yaparız
find ~/Documents -name '*.odt' -exec cp -nt ~/copies/ {} +
Örnek
İsmi subdir olanları hariç bırakmak için şöyle yaparız.
cp -r srcdir/!(subdir) dstdir
-t seçeneği
target directory anlamına gelir.
Örnek
Şöyle yaparız
cp -t ~/me/dir1 dir1/linkdir6/file1
--remove-destination seçeneği
Örnek
Elimizde şöyle bir sembolik link olsun. common.py dosyasını yani gerçek dosyayı değil ama semboli linkin başlangıcını değiştirmek isteyelim
sd/common.py -> actual_file
Şöyle yaparsak çalışmaz. Çünkü gidip gerçek dosyanın üzerine yazar
cp /tmp/Star_Wrangler/common.py sd/common.py
Açıklaması şöyle
This depends on what Unix you are using.

On some BSD systems (OpenBSD, FreeBSD), you will find that cp -f will unlink (remove) the symbolic link and replace it with the source.

Using GNU cp, this would not have the same effect, and you would need to use the long option --remove-destination instead.

On macOS, use cp -c to, as the manual says, "copy files using clonefile(2)".

On NetBSD, use cp -a ("archive mode", the same as cp -RpP on that system). This doesn't work on GNU, macOS, OpenBSD, or FreeBSD, even though all of these systems have the same or similar -a option for cp (on GNU systems, it's the same as -dR --preserve).

You already mention this yourself: Removing the link before copying the file will solve the issue. The rm utility removes the link rather than the file referenced by the link. This is also the most portable way to replace a symbolic link with a regular file.

Sembolik linki kaldırmak için şöyle yaparız.
rm -f sd/common.py
--sparse seçeneği
Şöyle yaparız.
$ cp --sparse=always junk junk.sparse && mv junk.sparse junk
-v seçeneği
Şöyle yaparız.
cp -v ~/Downloads/*.pdf ~/Downloads/BOOKS/
-x seçeneği - GNU Extension
Açıklaması şöyle. İç içe iki mount noktası varsa işe yarar.
The -x flag to cp is a GNU extension. When copying a single file, this option will have no effect, but when copying a whole file hierarchy, the -x option prevents the copying of files and directories that does not live on the same filesystem as the original source.

For example, on a filesystem with mount points at /usr and /usr/local, using cp -xR /usr /some-dest would not copy the hierarchy under /usr/local.

There are other utilities with an -x option with similar semantics, such as du and find (the flag is called -xdev for find), and rsync
Örnek
Şöyle yaparız.
cp -xr / blah


Hiç yorum yok:

Yorum Gönder