關于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編寫腳本尤其需要注意。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383461.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383461.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383461.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cp -r 和 cp -R 的區別

今天倒騰linux根文件系統的時候發現 cp -r /dev /dev_bak 時,竟然會 將磁盤設備中的數據進行一次拷貝,而不是僅僅建立設備文件。于是到網上搜了一把,收獲不小。http://www.loveunix.net/html/200407/33920.html這里有人問同樣的問題&#xff…

Makefile選項CFLAGS,LDFLAGS,LIBS

CFLAGS 表示用于 C 編譯器的選項, CXXFLAGS 表示用于 C 編譯器的選項。 這兩個變量實際上涵蓋了編譯和匯編兩個步驟。 CFLAGS: 指定頭文件(.h文件)的路徑,如:CFLAGS-I/usr/include -I/path/include。同樣地…

smbclient和掛載samba共享目錄

1,列出某個IP地址所提供的共享文件夾 smbclient -L 198.168.0.1 -U marsaber%12332112345672,像FTP客戶端一樣使用smbclient smbclient //192.168.0.1/tmp -U marsaber%1233211234567 執行smbclient命令成功后,進入smbclient環境,出現提示符…

linux 下source命令

當我修改了/etc/profile文件,我想讓它立刻生效,而不用重新登錄;這時就想到用 source 命令,如:source /etc/profile對source進行了 學習 ,并且用它與sh 執行腳本進行了對比,現在總結一下。source命令&#x…

make Image uImage與zImage的區別

內核編譯(make)之后會生成兩個文件,一個Image,一個zImage,其中Image為內核映像文件,而zImage為內核的一種映像壓縮文件,Image大約為4M,而zImage不到2M。 那么uImage又是什么的&#…

ubuntu下tftp的安裝、配置、使用

1. 安裝$ apt-get install tftp-hpa tftpd-hpa2. 建立目錄$ mkdir /tftpboot # 這是建立tftp傳輸目錄。$ sudo chmod 0777 /tftpboot$ sudo touch test.txt # test.txt文件最好輸入內容以便區分3. 配置$ sudo vi /etc/default/tftpd-hpa# /etc/default/tftpd-hpaTFTP_USERNAME&…

ubuntu下搭建nfs服務器

1.1 搭建NFS服務器 NFS(Network FileSystem,網絡文件系統)是由SUN公司發展,并于1984年推出的技術,用于在不同機器,不同操作系統之間通過網絡互相分享各自的文件。NFS設計之初就是為了在不同的系統間使…

uboot的常用命令詳解

U-Boot還提供了更加詳細的命令幫助,通過help命令還可以查看每個命令的參數說明。由于開發過程的需要,有必要先把U-Boot命令的用法弄清楚。接下來,根據每一條命令的幫助信息,解釋一下這些命令的功能和參數。 進入uboot的命令行提示…

minicom 串口信息過長分行顯示

有時串口輸出一行信息比較多,一行顯示不下,這個時候,我們可以用minicom的本身組合鍵設置,超過一行時自動卷起。 minicom 組合鍵的用法是:先按CtrlA組合鍵,然后松開這兩個鍵,再按Z鍵。另外還有一…

uboot 的 bootcmd 和bootargs參數詳解

U-boot的環境變量值得注意的有兩個: bootcmd 和bootargs。 bootargsconsolettyS1,115200n8 mem32M0x0 ispmem8M0x2000000 rmem24M0x2800000 init/linuxrc rootfstypesquashfs root/dev/mtdblock2 rw mtdpartsjz_sfc:256k(boot),2560k(kernel),2048k(root),-(appfs) …

MTD和 uboot中的bootargs 下屬 mtdparts

MTD 設備是象閃存芯片、小型閃存卡、記憶棒等之類的設備,它們在嵌入式設備中的使用正在不斷增長。 MTD 驅動程序是在 Linux 下專門為嵌入式環境開發的新的一類驅動程序。相對于常規塊設備驅動程序,使用 MTD 驅動程序的主要優點在于 MTD 驅動程序是專門為…

Linux應用程序在內存中的地址布局

棧:局部變量(初始化的和未初始化的,但不包含局部靜態變量)、局部只讀變量(const)堆:動態分配的區域(如使用malloc函數申請的區域)BSS段:存儲未初始化的全局變…

比較zImage和uImage的區別

一、vmlinuz vmlinuz是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制。Linux能夠使用硬盤空間作為虛擬內存,因此得名“vm”。 vmlinuz的建立有兩種方式。一是編譯內核時通過“make…

編譯faac錯誤分析

編譯faac時遇到了以下的編譯錯誤: /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/mips-linux-gnu/libc/usr/include/string.h:365:26: error:ambiguates old declaration const char* strcasestr(const char*, const char*) 解決方案&#x…

gcc與g++的區別

一:gcc與g比較 編譯c/c代碼的時候,有人用gcc,有人用g,于是各種說法都來了,譬如c代碼用gcc,而 c代碼用g,或者說編譯用gcc,鏈接用g,一時也不知哪個說法正確,如果…

交叉編譯openssl不修改Makefile的方法

網上流傳的方法都是要修改Makefile的cc值&#xff0c;我來說個不用修改的方法作者&#xff1a;帥得不敢出門 C哈哈堂<31843264>openssl 下載http://www.openssl.org/source/tar -xvf openssl-1.0.1c.tar.gzcd openssl-1.0.1c/CCarm-linux-gcc ./config no-asm shared -…

編譯boa過程記錄

boa是比較老的HTTP的本地Server&#xff0c;本文是針對0.94.13版本的編譯過程做出記錄 1.下載boa的程序包&#xff0c;本文的編譯是針對misp平臺的交叉編譯 2.在編譯之前&#xff0c;需要針對產品的文件系統和修改編譯時可能遇到的錯誤&#xff0c;修改相關的文件。 &#xff…

/dev/null 21 的作用

shell中可能經常能看到&#xff1a;>/dev/null 2>&1命令的結果可以通過%>的形式來定義輸出/dev/null 代表空設備文件> 代表重定向到哪里&#xff0c;例如&#xff1a;echo "123" > /home/123.txt1 表示stdout標準輸出&#xff0c;系統默認值是1&a…

移植wpa_supplicant 2.2問題

1.編譯libnl1.1問題 In file included from addr.c:28:0: ../include/netlink-local.h: In function __str2type: ../include/netlink-local.h:218:11: error: ULONG_MAX undeclared (first use in this function) ../include/netlink-local.h:218:11: note: each undeclared …

wpa_supplicant與wpa_cli之間通信過程

wpa_supplicant編譯&#xff1a; 1. wpa_supplicant/Android.mk : -- wpa_cli -- wpa_supplicant -- libwpa_client.so 2. hostapd/Android.mk : -- hostapd_cli -- hostapd 從通信層次上劃分&#xff0c;wpa_supplicant提供向上的控制接口 control interface&#xff0c;用于與…