cp --tidak ada target direktori yang dijelaskan

10

Pertanyaan: Saya perlu contoh sederhana tentang cara menggunakan cp --no-target-directory.

Saya memang mengalami beberapa kesulitan dalam memahami cp --no-target-directory. Saya memang mengerti penjelasannyamv --no-target-directory , tapi saya tidak bisa membayangkan cara menggunakannya cp.

Misalnya, ketika perintah mv /tmp/source /tmp/destberhasil, tidak ada jaminan yang /tmp/sourcediubah namanya menjadi /tmp/dest: itu bisa saja diubah namanya menjadi /tmp/dest/source, jika beberapa proses lain dibuat /tmp/destsebagai direktori. Namun, jika mv -T /tmp/source /tmp/destberhasil, tidak ada pertanyaan bahwa /tmp/source was renamed to/ tmp / dest`. ( sumber )

erch
sumber

Jawaban:

15

Secara default, cpmenguji apakah argumen terakhirnya adalah direktori yang ada. Jika ini terjadi, cpbuat tautan di dalam direktori itu, dengan nama dasar sumber. Artinya, diberi perintah

cp foo/bar wibble

jika wibbledirektori yang ada maka cpsalin sumber ke wibble/bar. Jika wibbletidak ada maka cptautkan sumber ke wibble.

Jika Anda ingin memastikan bahwa salinannya selalu wibble, maka Anda dapat menentukan opsi --no-target-directory(alias -T). Dengan begitu, jika cpberhasil, Anda dapat yakin bahwa salinannya dipanggil wibble. Jika wibblesudah ada sebagai direktori, maka cpakan gagal.

Dalam bentuk tabel:

The target is …             Without -T               With -T
existing directory          copy in the directory    error
existing file (not dir)     overwrite                overwrite
does not exist              create                   create

Satu-satunya perbedaan adalah bahwa dengan -T, jika targetnya adalah direktori yang ada, perintah mengembalikan kesalahan. Ini berguna ketika Anda mengharapkan direktori tidak ada: Anda mendapatkan pesan kesalahan alih-alih sesuatu yang tidak terduga terjadi.

Hal yang sama berlaku untuk mvdan ln. Jika targetnya adalah direktori yang sudah ada, dengan -T, mereka menandakan kesalahan daripada diam-diam melakukan sesuatu yang berbeda.

Dengan cp, ada kasus berbeda. Jika Anda melakukan salinan rekursif dan sumbernya adalah direktori, maka cp -Tsalin konten sumber ke tujuan, daripada menyalin sumber itu sendiri. Itu, diberikan

$ tree source destination 
source
└── foo
destination
└── bar

kemudian

$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'

sedangkan

% cp -rvT source destination
`source/foo' -> `destination/foo'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
8

Anda akan menggunakan --no-target-directoryjika Anda tidak ingin direktori sumber disalin di bawah direktori tujuan yang ada, Anda ingin direktori sumber disalin ke direktori tujuan.

Berikut adalah contoh salinan direktori dengan dan tanpa --no-target-directory:

$ mkdir a
$ touch a/b a/c
$ find
.
./a
./a/c
./a/b
$ cp -r a b       # b does not exist; becomes copy of a
$ find
.
./b
./b/b
./b/c
./a
./a/c
./a/b
$ rm -r b
$ mkdir b
$ cp -r a b       # b already exists; a is copied *underneath* it
$ find
.
./b
./b/a
./b/a/b
./b/a/c
./a
./a/c
./a/b
$ rm -r b
$ mkdir b
$ cp -r --no-target-directory a b     # b already exists; becomes copy of a
$ find
.
./b
./b/b
./b/c
./a
./a/c
./a/b

Anda dapat mencapai sesuatu dengan efek yang sama dengan suffixing nama direktori sumber dengan slash-dot /.seperti pada: cp -r a/. byang menyalin direktori sumber a ke b dan tidak di bawahnya b .

Tidak satu pun dari metode di atas sama dengan mengatakan "salin hanya isi direktori sumber ke tujuan yang ada" karena, jika Anda meminta untuk menghemat waktu dan izin, direktori tujuan yang ada akan memperoleh waktu dan izin direktori sumber. Contoh (diedit untuk menghapus informasi yang tidak perlu):

$ find . -ls
drwx------   Oct 13 13:31 ./b         # note date and permissions
drwxr-xr-x   Jan  1  2013 ./a         # note date and permissions
-rw-r--r--   Oct 13 13:23 ./a/c
-rw-r--r--   Oct 13 13:23 ./a/b
$ cp -rp --no-target-directory a b    # preserve mode and timestamps
$ find . -ls
drwxr-xr-x   Jan  1  2013 ./b         # note copied date and permissions
-rw-r--r--   Oct 13 13:23 ./b/b
-rw-r--r--   Oct 13 13:23 ./b/c
drwxr-xr-x   Jan  1  2013 ./a
-rw-r--r--   Oct 13 13:23 ./a/c
-rw-r--r--   Oct 13 13:23 ./a/b

Salinan hanya konten tidak akan mentransfer mode atau cap waktu dari direktori sumber ke direktori tujuan.

Ian D. Allen
sumber
2

Bagaimana dengan yang berikut ini?

$ cp -rvT Dir_1 Dir_2
‘Dir_1/File_3.txt’ -> ‘Dir_2/File_3.txt’
‘Dir_1/File_1.txt’ -> ‘Dir_2/File_1.txt’
‘Dir_1/File_2.txt’ -> ‘Dir_2/File_2.txt’
$ cp -rv Dir_1 Dir_2
‘Dir_1’ -> ‘Dir_2/Dir_1’
‘Dir_1/File_3.txt’ -> ‘Dir_2/Dir_1/File_3.txt’
‘Dir_1/File_1.txt’ -> ‘Dir_2/Dir_1/File_1.txt’
‘Dir_1/File_2.txt’ -> ‘Dir_2/Dir_1/File_2.txt’

Dengan demikian, ini hanya cara penulisan yang berbeda cp Dir_1/* Dir_2/. Namun, ia menangkap file tersembunyi di root Dir_1 yang akan dilewatkan dengan sederhana cp *.

$ touch Dir_1/.Hidden_File_{1,2,3}.txt
$ cp -rv Dir_1/* Dir_2
cp: No match.
$ cp -rvT Dir_1 Dir_2
‘Dir_1/.Hidden_File_2.txt’ -> ‘Dir_2/.Hidden_File_2.txt’
‘Dir_1/.Hidden_File_3.txt’ -> ‘Dir_2/.Hidden_File_3.txt’
‘Dir_1/.Hidden_File_1.txt’ -> ‘Dir_2/.Hidden_File_1.txt’
Railgun2
sumber
berfungsi untuk saya dengan --no-target-directoryopsi [keluar] : selama saya menggunakan --recursive, semuanya baik-baik saja [dengan coreutils 8.12GNU / Linux]. Perbedaan utama tampaknya adalah bahwa dengan --no-target-directorykonten tetapi tidak direktori itu sendiri disalin [penelitian masih berlangsung]
erch