关于cp命令中拷贝所有的写法
生活随笔
收集整理的這篇文章主要介紹了
关于cp命令中拷贝所有的写法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天在編寫一個腳本的時候,發現一個比較奇怪的問題:就是在使用cp拷貝當前目錄下所有文件到目標目錄的時候,源和目標大大不同。原來一直沒有留意有這樣的問題,后來查了些資料,才知道以前一直使用的格式有誤,艾。。。 一、預備 cp就是拷貝,最簡單的使用方式就是: cp oldfile newfile 但這樣只能拷貝文件,不能拷貝目錄,所以通常用: cp -r old/ new/ 那就會把old目錄整個拷貝到new目錄下。注意:不是把old目錄里面的文件拷貝到new目錄,而是把old直接拷貝到new下面,結果是: [root@dc5 test]# ll new/
total 4
drwxr-xr-x ?2 root root 4096 Dec 15 11:55 old 那如果要保持源文件的所有權限,可以這樣: cp -rp old/ new/ -p參數,可以保持權限、宿主、時間棧,還可能包括link等;還有更簡單的,就是用: cp -a old/ new/ -a 參數,就等于-dpR. 二,問題: 好,我們看看這次的問題。環境是: 兩個目錄:old、new,其中old里面有個三個內容:test1文件、test2目錄,還有就是.test3,這是一個隱藏文件。 [root@dc5 test]# ll -laR
.:
total 20
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 .
drwxrwxrwt ?7 root root 4096 Dec 15 11:59 ..
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 new
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 old
./new:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
./old:
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
./old/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .. 操作一: [root@dc5 test]# cp -a old/* new/
[root@dc5 test]# ll -laR new/
new/:
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:15 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
new/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?3 root root 4096 Dec 15 12:15 .. 問題出來了:隱藏的.test3文件沒有一起拷貝到new目錄下。 原因是:×參數使用不正確。這樣的寫法,通常都是因為熟悉了過去DOS格式。而且實際在bash環境下,cp使用×是不能匹配類似.開通的隱藏文件的。 操作二: 正確的寫法應該這樣: [root@dc5 test]# cp -a old/. new/
[root@dc5 test]# ll -laR new/
new/:
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
new/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .. 不用*號,而用.號代替。
還有一種比較復雜一些的寫法: [root@dc5 test]# cp -a old/* old/.[^.]* new/
[root@dc5 test]# ll -laR new/
new/:
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:25 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
new/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-請注意寫法,不要寫成.*了。(原因請看下面)
三、問題2
上面提到不要寫成.*,那.*代表什么? [root@dc5 test]# echo .*
. .. .*代表的是當前目錄,以及上一層目錄。
所以,使用.*會導致更大的問題:
[root@dc5 test]# cp -a old/.* new/
cp: cannot copy a directory, `old/..', into itself, `new/'
cp: cannot copy a directory, `old/..', into itself, `new/'
cp: will not create hard link `new/old' to directory `new/.'
cp: overwrite `new/.test3'? y
[root@dc5 test]# ll -laR new/
new/:
total 16
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 new
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
new/new:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
new/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 .. 也就是說,使用.*就等于這樣了: [root@dc5 test]# cp -a old/. old/.. old/.test3 new/
[root@dc5 test]# echo old/.*
old/. old/.. old/.test3 其實這樣的問題,不單cp命令有這樣的問題,在所有涉及含有特殊字符意義文件的命令時,都需要考慮,例如rm: [root@dc5 new]# ll -a
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
[root@dc5 new]# rm -rf *
[root@dc5 new]# ll -a
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:40 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3 正確的寫法應該是:
[root@dc5 new]# rm -rf .* *
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'
[root@dc5 new]# ll -a
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:42 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 .. ※很多時候,預計的和實際的結果是完全不一樣的。bash編寫腳本尤其需要注意。
total 4
drwxr-xr-x ?2 root root 4096 Dec 15 11:55 old 那如果要保持源文件的所有權限,可以這樣: cp -rp old/ new/ -p參數,可以保持權限、宿主、時間棧,還可能包括link等;還有更簡單的,就是用: cp -a old/ new/ -a 參數,就等于-dpR. 二,問題: 好,我們看看這次的問題。環境是: 兩個目錄:old、new,其中old里面有個三個內容:test1文件、test2目錄,還有就是.test3,這是一個隱藏文件。 [root@dc5 test]# ll -laR
.:
total 20
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 .
drwxrwxrwt ?7 root root 4096 Dec 15 11:59 ..
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 new
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 old
./new:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
./old:
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
./old/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .. 操作一: [root@dc5 test]# cp -a old/* new/
[root@dc5 test]# ll -laR new/
new/:
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:15 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
new/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?3 root root 4096 Dec 15 12:15 .. 問題出來了:隱藏的.test3文件沒有一起拷貝到new目錄下。 原因是:×參數使用不正確。這樣的寫法,通常都是因為熟悉了過去DOS格式。而且實際在bash環境下,cp使用×是不能匹配類似.開通的隱藏文件的。 操作二: 正確的寫法應該這樣: [root@dc5 test]# cp -a old/. new/
[root@dc5 test]# ll -laR new/
new/:
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
new/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .. 不用*號,而用.號代替。
還有一種比較復雜一些的寫法: [root@dc5 test]# cp -a old/* old/.[^.]* new/
[root@dc5 test]# ll -laR new/
new/:
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:25 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
new/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-請注意寫法,不要寫成.*了。(原因請看下面)
三、問題2
上面提到不要寫成.*,那.*代表什么? [root@dc5 test]# echo .*
. .. .*代表的是當前目錄,以及上一層目錄。
所以,使用.*會導致更大的問題:
[root@dc5 test]# cp -a old/.* new/
cp: cannot copy a directory, `old/..', into itself, `new/'
cp: cannot copy a directory, `old/..', into itself, `new/'
cp: will not create hard link `new/old' to directory `new/.'
cp: overwrite `new/.test3'? y
[root@dc5 test]# ll -laR new/
new/:
total 16
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 new
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
new/new:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
new/test2:
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 .. 也就是說,使用.*就等于這樣了: [root@dc5 test]# cp -a old/. old/.. old/.test3 new/
[root@dc5 test]# echo old/.*
old/. old/.. old/.test3 其實這樣的問題,不單cp命令有這樣的問題,在所有涉及含有特殊字符意義文件的命令時,都需要考慮,例如rm: [root@dc5 new]# ll -a
total 12
drwxr-xr-x ?3 root root 4096 Dec 15 12:14 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:05 test1
drwxr-xr-x ?2 root root 4096 Dec 15 12:14 test2
[root@dc5 new]# rm -rf *
[root@dc5 new]# ll -a
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:40 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 ..
-rw-r--r-- ?1 root root ? ?0 Dec 15 12:07 .test3 正確的寫法應該是:
[root@dc5 new]# rm -rf .* *
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'
[root@dc5 new]# ll -a
total 8
drwxr-xr-x ?2 root root 4096 Dec 15 12:42 .
drwxr-xr-x ?4 root root 4096 Dec 15 11:55 .. ※很多時候,預計的和實際的結果是完全不一樣的。bash編寫腳本尤其需要注意。
總結
以上是生活随笔為你收集整理的关于cp命令中拷贝所有的写法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 密战剧情介绍
- 下一篇: cp -r 和 cp -R 的区别