文章簡介:獲取select被選中項的文本,select下拉框的第二個元素為當前選中值,radio單選組的第二個元素為當前選中值,獲取值:文本框,文本區域:$("#txt").attr("value");多選框checkbox:$("#checkbox_id").attr("value");單選組radio: $("input[@type=radio][@checked]").val();下拉框select: $('#sel').val(); …… var item = $('input[@name=items][@checked]').val();
var item = $("select[@name=items] option[@selected]").text();
$('#select_id')[0].selectedIndex = 1;
$('input[@name=items]').get(1).checked = true;
文本框,文本區域:$("#txt").attr("value"); 多選框checkbox:$("#checkbox_id").attr("value"); 單選組radio: $("input[@type=radio][@checked]").val(); 下拉框select: $('#sel').val(); 控制表單元素: 文本框,文本區域:$("#txt").attr("value",'');//清空內容 ?? $("#txt").attr("value",'11');//填充內容
?? $("#chk2").attr("checked",true);//打勾 ?? if($("#chk1").attr('checked')==undefined) //判斷是否已經打勾
?? $("<optionvalue='1'>1111</option><optionvalue='2'>2222</option>").appendTo("#sel")//添加
?? $("#sel").empty();//清空下拉框
var item = $('input[@name=items][@checked]').val();
var item = $("select[@name=items] option[@selected]").text();
$('#select_id')[0].selectedIndex = 1;
$('input[@name=items]').get(1).checked = true;
文本框,文本區域:$("#txt").attr("value");
文本框,文本區域:$("#txt").attr("value",'');//清空內容
|
說明:
每個表的主鍵id對應一個your_sequence_name
查詢sequence為 select * from user_sequences;
刪除sequence為 drop? your_sequence_name;
oracle基本操作語句(適合初學者) |
oracle操作語句: 1.創建表 create?table?表名( ?列名1?類型, ?列名2?類型 ); 2.修改類屬性 alter?table?表名?modify(列名?類型); 3.添加列 alter?table?表名?add(列名?類型); 4.添加主鍵約束和非空約束 alter?table?表名?add?constraint?pk_表名?primary?key(列名); alter?table?表名?modify(列名?not?null); 5.刪除主鍵約束 alter?table?表名?drop?primary?key; alter?table?表名?drop?constraint?pk_表名; 6.失效約束 alter?table?表名?disable?primary?key; alter?table?表名?disable?constraint?pk_表名; 7.有效約束 alter?table?表名?enable?primary?key; alter?table?表名?enable?constraint?pk_表名; 8.刪除列 alter?table?表名?drop?column?列名; 9.設置某列不可用,然后刪除 alter?table?表名?set?unused(列名); alter?table?表名?drop?unused?columns; 10.修改表名 rename?表名1?to?表名2 alter?表名1?rename?to?表名2; 11.截斷表 truncate?table?表名; 12.截斷表保留行空間 truncate?table?表名?resue?storage; 13.查看表結構 desc?table?表名; 14.刪除表 drop?table?表名; 15.插入記錄 例:insert?into?表名?values(內容1,內容2,內容3,內容4); 16.帶參數對話方式插入行 例:insert?into?表名?values(&列名1,&列名2); ??insert?into?表名?values(內容1,內容2); 17.插入某幾列記錄 insert?into?表名(列名1,列名2)?values(內容1,內容2); 18.為列插入空值(其列不能為not?null) insert?into?表名?values(內容1,null,null); 19.創建表(包括主鍵及外鍵設置)方法一 create?table?表名( ??列名1?類型 ??constraint?pk_表名?primary?key, ??列名2?類型?not?null, ??列名3?類型? ??constraint?fk_表名?reference?表名(列名), ??列名3?類型 ??constraint?ck_表名?check(列名3?in(''內容1'',''內容2'',''內容3''))? ); 20.查詢所有行 select?*?from?表名; 21.查詢某幾列 select?列名1,列名2?from?表名; 22.重復行消除 select?distict?列名?from?表名; 23.where語句查詢 select?*?from?表名?where?條件?order?by?列名; (注:如number類型查出自動按升序排列,如要按降序排列,則select?*?from?表名?where?條件?order?by?列名?desc;) 24.創建表,方法二 create?table?表名( ?列名1?類型?primary?key, ?列名2?類型?not?null, ?列名3?類型?check(列名3?in('''','''','''')), ?列名4?類型?refernce?表名(列名) ); 25.修改?列=‘?’的數據 update?表名?set?(列=?)?where?列=‘?’; 26.刪除行 delete?from?表名?where?條件; 27.事務處理 --事務處理 update?表名 set?列名(日期)?=?''30-5月-98'' where?條件; savepoint?mark1; delete?from?表名?where?條件; savepoint?mark2; rollback?to?savepoint?mark1; rollback; 28.建立用戶user1,密碼為password 授予用戶connect,resource的權限 connect角色用于登錄 resource角色用于建表等. connect?system/manager create?user?user1?identified?by?password; grant?connect,resource?to?password; 29.數據控制語言 connect?scott/tiger 30.把對表1查詢和修改的權限授予user1 grant?select,update?on?表1?to?user1; 31.把對表表1中列1和列2修改的權限授予user1 grant?update(列1,列2)?on?表1?to?user1; 32.把對表表1查詢的權限授予用戶user1 并且user1用戶還可以把這個權限授予別的用戶(with?grant?option) grant?select?on?表1?to?user1?with?grant?option; 33.從用戶user1撤銷對表1查詢和修改的權限 revoke?select,update?on?表1?from?user1; |
?function bOnClick()??
?{??
???jsuser.getKeyHTMl(strInput,callback);?
?}??
?function callback(msg)??
?{??
??objouter.innerHTML = msg;
??if(msg=="")
??{
???objouter.style.display = 'none';
??}else
??{
???objouter.style.display = '';
??}
?}??
??
}
function chageSelection(isUp){
?if (objouter.style.display == 'none'&& objInput.value !="" && objouter.innerHTML!="")
?{
??objouter.style.display = '';
?}
?else {
??if (isUp)
???selectedIndex++
??else
???selectedIndex--
?}
?var maxIndex = objouter.children.length - 1;
?if (selectedIndex < 0) {
??selectedIndex = -1
?}
?if (selectedIndex > maxIndex) {
??selectedIndex = 0
?}
?for (intTmp = 0; intTmp <= maxIndex; intTmp++) {
??if (intTmp == selectedIndex) {
???objouter.children[intTmp].className = "sman_selectedStyle";
??}
??else {
???objouter.children[intTmp].className = "";
??}
?}
}
function outSelection(Index){
?if (!objouter.children[Index])
??return;
?objInput.value = objouter.children[Index].innerText;
?objouter.style.display = 'none';
}
function divPosition(){
?objouter.style.top = getAbsoluteHeight(objInput) + getAbsoluteTop(objInput);
?objouter.style.left = getAbsoluteLeft(objInput);
?objouter.style.width = getAbsoluteWidth(objInput)
}
function getAbsoluteHeight(ob)
{
?return ob.offsetHeight
}
function getAbsoluteWidth(ob)
{
?return ob.offsetWidth
}
function getAbsoluteLeft(ob)
{
?var s_el = 0;
?el = ob;
?while (el) {
??s_el = s_el + el.offsetLeft;
??el = el.offsetParent;
?};
?return s_el
}
function getAbsoluteTop(ob)
{
?var s_el = 0;
?el = ob;
?while (el) {
??s_el = s_el + el.offsetTop;
??el = el.offsetParent;
?};
?return s_el
}
}
</script>
<style>
.inp {border: 1px solid #999;padding: 0px 0 0 2px;height: 23px;line-height: 23px;font-size: 14px;color: #666}
.inp.sffocus {background: #fff;border: 1px solid #f90;color: blue;}
.sman_selectedStyle{background-Color:#102681;color:#FFFFFF}
</style>
<input name="textinput" onfocus="smanPrompt(this)"? tabindex="1" type="text" size="45" class="inp" value="" id="inputer" />
<div id="__smanDisp" style="position:absolute;display:none;background:#E8F7EB;border: 1px solid #CCCCCC;font-size:14px;cursor: default;onbulr"> </div>
?public String getKeyHTMl(String key)
??? {
??? ?//System.out.println(key);
??? ?String temp = "";
??? ?Pattern p = Pattern.compile("^("+key+")");//<[^>]+>
??? ?Matcher m = null;
??? ?for(int i=0; i<keyarry.length; i++)
??? ?{
??? ?? m = p.matcher(keyarry[i]);
??? ??if(m.find())
??? ??{
??? ???temp = temp + "<div onmouseover=\"this.className='sman_selectedStyle'\" " +
????"onmouseout=\"this.className=''\" " +
????"onmousedown=\"document.getElementById('inputer').value='" + keyarry[i] + "';window.focus();\">" + keyarry[i].replace(key, "<font color=red>"+key+"</font>") + "</div>";
??? ??}
??? ?}
??? ?return temp;
??? }
請參考:
1、列文件或目錄的信息工具 ls或dir;
ls 命令可以用于顯示目錄的內容,也可以顯示文件的屬性,比如節點、文件種類、權限、擁有者、大小、創建時間等;在目前最新版本的Linux中dir和ls命令的用法是一樣的;有興趣的不仿嘗試一下;
1.1 ls 的基礎語法和參數;
語法格式:
#ls [參數]?? [目錄或文件名]
參數:
-a 顯示所有文件,包含隱藏文件;包括“.“和“..“
-A 顯示所有文件,包含隱藏文件,不包括“.“和“..“目錄;
-B 不列出文件名以~結尾的文件;
-C 按列列出文件;
-d 僅可以查看目錄的屬性參數及信息;
-F 這個參數加上后,能給目錄添加上/,給可執行文件加上*,給符號鏈接加上@? 等等,來標記文件名,目的是讓用戶方便查看;
-l 長格式輸出
-h 習慣人們可閱讀的方式來顯示文件或目錄的大小,比如K、M或G等;
-p 在目錄的后面附加/標記;
-r 逆序列出文件;
-t? 按文件最后訪問(或修改)的時間排序,最新的排在最前面;
-U 按原始排序,
-L 遞歸顯示,也就是說,當我們列某個目錄的下的所有文件和目錄時,能把它的下級目錄的內容顯示出來。
--help? 獲得幫助;
在這里,位于[]之內的都是可選的。如果您只輸入ls ,就會列出用戶所處當前目錄的所有文件,用短格式輸出,但不會列出隱藏文件。
判斷用戶所處目錄的命令是pwd,也就是
[root@localhost ~]# pwd
/root
1.2 ls 的參數示例應用;
1.21 列出目錄下所有文件,包含或不包含隱藏文件,-a 參數及-l參數的運用;
#ls -la [目錄名]
如果不接目錄名,表示輸出當前用戶所處目錄內的所有文件,包括隱藏文件;
[root@localhost ~]# pwd
/root
[root@localhost ~]# ls -la
列出某一目錄下的的文件或目錄,但不包括隱藏文件,我們只用-l參數
#ls -l? 目錄
比如:
[root@localhost ~]# ls? -l /root/
總計 13968
-rw-r--r-- 1 root root???????? 0 04-19 14:09 123.txt
-rw------- 1 root root????? 1375 03-16 08:55 anaconda-ks.cfg
-rw-r--r-- 1 root root???????? 2 03-27 02:00 fonts.scale
-rw-r--r-- 1 root root????? 5423 03-16 08:52 install.log.syslog
-rw-r--r-- 1 root root? 14087155 03-16 07:53 kernel-2.6.15-1.2025_FC5.i686.rpm
lrwxrwxrwx 1 root root??????? 33 04-19 11:27 kernel.rpm -> kernel-2.6.15-1.2025_FC5.i686.rpm
drwxr-xr-x 2 1000 users???? 4096 04-04 23:30 mkuml-2004.07.17
-rw-r--r-- 1 root root???? 68012 04-04 20:28 mkuml-2004.07.17-ananas.tar.bz2
drwxr-xr-x 2 root root????? 4096 04-19 10:53 mydir
-rw-r--r-- 1 root root???? 53992 03-16 08:54 myinstall.log
-rw-r--r-- 1 root root???????? 0 04-19 14:10 plinux.txt
drwxr-xr-x 2 root root????? 4096 03-17 04:25 Public
-rw-r--r-- 1 root root?????? 613 03-26 18:41 upgrade.log
-rw-r--r-- 1 root root???????? 0 03-26 18:39 upgrade.log.syslog
lrwxrwxrwx 1 root root???????? 6 04-19 11:17 yourdir -> mydir/
說明:如果以長格式輸入,總共顯示出八段內容:
第一段文件種類及權限,也就是類似這樣的-rw-r--r-- ,我們在前面講到,如果在這段中,第一字符表示文件的類型,如果出現-,表示普通文件。如果是d開頭的就是目錄。在這個例子中,123.txt是普通文件,而mkuml-2004.07.17就是一個目錄。關于文件的種類,請參考 :
rw-r--r--是權限位,我們在以后的教程中會講到。
第二段 硬鏈接個數(文件系增加一個硬鏈接,數字會增加1,默認從1開始,1表示無硬鏈接文件,如果是一個目錄,它的默認值應該是2。目錄是不能做硬鏈接的)
如果我們不以長格式輸出的話,可以把參數省略;
第三段 文件或目錄所占用的字節數,如果您想用K來表示,請用ls -lh /root
第四段 最后訪問日期
第五段 最后訪問時間
第六段 文件名
[root@localhost ~]# ls /root
1.22 僅查看目錄的屬性的-d參數的運用示例;
[root@localhost ~]# ls -ld? /etc? /boot? 注:查看/etc和/boot目錄的信息;
drwxr-xr-x?? 4 root root? 4096 04-11 16:22 /boot
drwxr-xr-x 108 root root 12288 04-20 12:36 /etc
1.23 查看文件或目錄的inode節點,-i參數的運用;
查看文件或目錄的節點,我們要用到i參數。如果節點相同,能確認他們是相同的文件,是通過通過ln 創建的硬鏈接文件;鏈接接有何用?如果您想把一個文件復制時保持原文件或目錄的節點、大小、權限以及訪問(或修改)時間都和原文件一致的文件。必須通過硬鏈接來實現,用cp命令是不可能實現的。
比如:
[root@localhost ~]# ls -li /root
[root@localhost ~]# ls -li kernel*
2408323 -rw-r--r-- 3 root root 14087155 03-16 07:53 kernel00.rpm
2408270 lrwxrwxrwx 1 root root?????? 33 04-19 14:56 kernel1.rpm -> kernel-2.6.15-1.2025_FC5.i686.rpm
2408323 -rw-r--r-- 3 root root 14087155 03-16 07:53 kernel-2.6.15-1.2025_FC5.i686.rpm
2408323 -rw-r--r-- 3 root root 14087155 03-16 07:53 kernel.rpm
我們看一下kernel00.rpm 、kernel.rpm 和 kernel-2.6.15-1.2025_FC5.i686.rpm 是不是節點相同??他們的大小是不是一樣,他們的訪問日期是不是一樣?只是他們的文件名不一樣。文件名不一樣沒有關系,這能證明其中兩個文件是由另一個文件通過ln 創建而成。
您可以嘗試著用cp 把 kernel-2.6.15-1.2025_FC5.i686.rpm 復制為kernel002.rpm ,看看能不能保持節點相同?
[root@localhost ~]# ls -li kernel*
2408272 -rw-r--r-- 1 root root 14087155 04-19 16:05 kernel002.rpm
2408323 -rw-r--r-- 3 root root 14087155 03-16 07:53 kernel00.rpm
2408270 lrwxrwxrwx 1 root root?????? 33 04-19 14:56 kernel1.rpm -> kernel-2.6.15-1.2025_FC5.i686.rpm
2408323 -rw-r--r-- 3 root root 14087155 03-16 07:53 kernel-2.6.15-1.2025_FC5.i686.rpm
2408323 -rw-r--r-- 3 root root 14087155 03-16 07:53 kernel.rpm
不是是kernel002.rpm 的節點和 kernel-2.6.15-1.2025_FC5.i686.rpm 不一樣了?
1.24 關于排序的參數的應用;
ls 顯示目錄的內容時,會將文件按a到z的字母順序顯示,優先級如下;
數字?
a-z?
A-Z
也就是說如果不加任何排序的參數,文件名第一個字母是數字的,將優先顯示;其次才是A-Z,然后才是a-z;下面是幾個排序的參數,大家練習一下就知道了;
在文件的大小排序上,我們要用到-S參數;
如果是逆序排序時,我們要用到-r參數;
按最后訪問的時候排序,要用到-t參數;
根據擴展名進行排序,要用到參數 -X ;
舉例
[root@localhost ~]# ls
123.txt????????? fonts.scale???????? kernel?????????????????????????? myinstall.log? upgrade.log
anaconda-ks.cfg? install.log.syslog? mkuml-2004.07.17-ananas.tar.bz2? plinux.txt???? upgrade.log.syslog
[root@localhost ~]# ls -lS /root
[root@localhost ~]# ls -lS
總計 180
-rw-r--r-- 1 root root 68012 04-04 20:28 mkuml-2004.07.17-ananas.tar.bz2
-rw-r--r-- 1 root root 53992 03-16 08:54 myinstall.log
-rw-r--r-- 1 root root? 5423 03-16 08:52 install.log.syslog
drwxr-xr-x 2 root root? 4096 04-19 20:04 kernel
-rw------- 1 root root? 1375 04-19 15:04 anaconda-ks.cfg
-rw-r--r-- 1 root root?? 613 03-26 18:41 upgrade.log
-rw-r--r-- 1 root root??? 21 04-19 15:06 123.txt
-rw-r--r-- 1 root root???? 2 03-27 02:00 fonts.scale
-rw-r--r-- 1 root root???? 0 04-19 14:10 plinux.txt
-rw-r--r-- 1 root root???? 0 03-26 18:39 upgrade.log.syslog
舉例:
[root@localhost ~]# ls -lr
總計 180
-rw-r--r-- 1 root root???? 0 03-26 18:39 upgrade.log.syslog
-rw-r--r-- 1 root root?? 613 03-26 18:41 upgrade.log
-rw-r--r-- 1 root root???? 0 04-19 14:10 plinux.txt
-rw-r--r-- 1 root root 53992 03-16 08:54 myinstall.log
-rw-r--r-- 1 root root 68012 04-04 20:28 mkuml-2004.07.17-ananas.tar.bz2
drwxr-xr-x 2 root root? 4096 04-19 20:04 kernel
-rw-r--r-- 1 root root? 5423 03-16 08:52 install.log.syslog
-rw-r--r-- 1 root root???? 2 03-27 02:00 fonts.scale
-rw------- 1 root root? 1375 04-19 15:04 anaconda-ks.cfg
-rw-r--r-- 1 root root??? 21 04-19 15:06 123.txt
[root@localhost ~]# ls -lt
總計 180
drwxr-xr-x 2 root root? 4096 04-19 20:04 kernel
-rw-r--r-- 1 root root??? 21 04-19 15:06 123.txt
-rw------- 1 root root? 1375 04-19 15:04 anaconda-ks.cfg
-rw-r--r-- 1 root root???? 0 04-19 14:10 plinux.txt
-rw-r--r-- 1 root root 68012 04-04 20:28 mkuml-2004.07.17-ananas.tar.bz2
-rw-r--r-- 1 root root???? 2 03-27 02:00 fonts.scale
-rw-r--r-- 1 root root?? 613 03-26 18:41 upgrade.log
-rw-r--r-- 1 root root???? 0 03-26 18:39 upgrade.log.syslog
-rw-r--r-- 1 root root 53992 03-16 08:54 myinstall.log
-rw-r--r-- 1 root root? 5423 03-16 08:52 install.log.syslog
1.25 遞歸顯示目錄的文件,-R參數的應用;
遞歸顯示目錄下的所有文件,如果該目錄下有子目錄,也會把子目錄的文件一并顯示出來。
比如
[root@localhost ~]# ls -lR /
注:也就是把Linux下/根目錄下的所有文件顯示出來,但不會顯示隱藏文件。自己試著輸入上面的命令就知道怎么回事了。
1.26 關于ls 輸出內容在終端顯示顏色的參數 --color;
在一般的情況下,ls輸出內容是有顏色的,比如目錄是藍色,壓縮文件是紅字的顯示。如果沒有顏色,可以加上參數。當然也可以去掉顏色。
--color=never? 表示輸出輸出沒有彩色
--color=auto? 表示自動
--color=always 表示輸出內容有彩色
舉例:
[root@localhost ~]# ls -la --color=never
[root@localhost ~]# ls -la --color=any
[root@localhost ~]# ls -la --color=always
如果您的終端或控制臺輸出的內容沒有顏色,可以自己來定義。在當前用戶的家目錄下的.bashrc 中加入下面的一行;
alias ls="ls --color=always"
1.27 ls的-F參數的示例;
[root@localhost ~]# ls -F
crondw.sh*? kernel/? mkuml-2004.07.17-ananas.tar.bz2? openQreadme.txt@? sun.txt? upgrade.log? youdir/
[root@localhost ~]# ls -lF
總計 92
-rwxr-xr-x 1 root root???? 0 04-20 14:18 crondw.sh*
drwxr-xr-x 3 root root? 4096 04-20 14:17 kernel/
-rw-r--r-- 1 root root 68012 04-04 20:28 mkuml-2004.07.17-ananas.tar.bz2
lrwxrwxrwx 1 root root???? 7 04-20 14:18 openQreadme.txt -> sun.txt
-rw-r--r-- 1 root root??? 11 04-20 14:17 sun.txt
-rw-r--r-- 1 root root?? 613 03-26 18:41 upgrade.log
drwxr-xr-x 6 root root? 4096 04-20 14:17 youdir/
1.3 通配符在ls命令中的應用;
* 代表0個或多個字符
[]內部包括任何字符
? 任何單個字符
舉例:
比如我們顯示以k開頭的所有文件,在/root目錄中的;
[root@localhost ~]# ls /root/k*
kernel002.rpm? kernel00.rpm? kernel1.rpm? kernel-2.6.15-1.2025_FC5.i686.rpm? kernel.rpm
我們顯示以數字開頭的所有文件;
[root@localhost ~]# ls [0-9]*
123.txt? 234.txt? 2kexe.txt? 6mns.doc
下面是一個?通配符的示例:
[root@localhost ~]# ls *.t?t
123.txt? 234.txt? 2kexe.txt? 333.tot? plinux.txt
1.4 獲得ls 的幫助;
ls 的用法比較簡單,至于更詳細的參考,還是查man和help。遇到不會的,就查手冊,我也是這么做的。
[root@localhost ~]# ls --help
[root@localhost ~]# man ls
[root@localhost ~]# info ls
2、移動文件或目錄的命令 mv ;
mv 命令是用來移動文件或目錄的;有以下幾種格式;
#mv file1 file2? 注:把file1移動到file2,如果file2不存在,則創建file2文件名;
#mv file1 dir 注:把一個文件移動到一個事實存在的目錄;
#mv dir1 dir2?? 移動目錄dir1 到 dir2 ,如果dir2不存在,則創建它;
#mv file1 file2 file3 ... ...? dir?? 移動file1、file2、file3等多個文件到dir目錄中;
#mv dir1 dir2 ... ... dirn?? 注:移動目錄dir1和dir2等多個目錄到dirn目錄中
參數-i ,表示人機交互模式;提示警告信息;
舉例:
[root@localhost ~]# mv -i 123.txt? 234.txt
mv:是否覆蓋“234.txt”? y 注:要在這里輸入y,表示允許覆蓋234.txt文件;如果是n,請示不允許;
mv 也能和通配符結合一起使用,這樣能把相似特征的文件移動到某處;
* 代表0個或多個字符
[]內部包括任何字符
? 任何單個字符
舉例:比如移動以數字開頭的文件或目錄到 root目錄下的tmp目錄中;
[root@localhost ~]# pwd
/root
[root@localhost ~]# mv [0-9]* tmp/
[root@localhost ~]# ls -lh tmp/
總計 4.0K
-rw-r--r-- 1 root root 21 04-19 15:06 234.txt
-rw-r--r-- 1 root root? 0 04-19 22:23 2kexe.txt
-rw-r--r-- 1 root root? 0 04-19 22:25 333.tot
-rw-r--r-- 1 root root? 0 04-19 22:23 6mns.doc
3、文件或目錄的復制工具cp ;
3.1 cp 的語法和參數
#cp? [參數選項]?? 源文件或目錄????? 目標文件或目錄
注:參數是可選的,常用參數比如 -r,-R,-p,-i ;
參數說明(部份)
-a 等同于-dpR參數一起使用;在復制過程中盡可能保留源文件或目錄的屬性;
-b 給被覆蓋的文件做備份。比如我們把file1 復制到file2時,如果file2存在,我們把file2覆蓋掉,用這個參數就能同時生成一個file2~的文件,注意文件名后有~結尾
-d 不間接引用符號鏈接,保持源文件和目標文件之間的硬鏈接關系;
-f 刪除已存在的目標文件;
-i 覆蓋已存在的目標文件之前給出警告提示,這是人機交互的選項;
-l 建立文件硬鏈接,而不是復制;
-p 保存源文件或目錄的最后修改時間和模式,比如要保持目標目錄或文件的屬主、組、權限和最后訪問(或修改)時間;
-R 復制目錄時,包括淅目錄下所有的子目錄和文件;
-s 建立源文件的符號鏈接,而不是復制源文件。源文件名必須用絕對路徑;
-r 復制目錄時,包括淅目錄下所有的子目錄和文件;-r選項不同于-R之處在于 嘗試打開目的地文件前先刪除已存在的目的地文件
-i 人機交互模式,顯法覆蓋已存在的文件或目錄的警告信息;
-v 在復制之前,輸出每個文件的名字;
--help 查看幫助 ;
3.2 示例說明cp應用;
3.21 參數-i的示例;
[root@localhost ~]# ls
anaconda-ks.cfg? install.log.syslog? Kernel.rpm?????????????????????? mydir?????? Plist? upgrade.log???????? youdir
fonts.scale????? kernel????????????? mkuml-2004.07.17-ananas.tar.bz2? plinux.txt? sun??? upgrade.log.syslog
[root@localhost ~]# pwd
/root
[root@localhost ~]# cp? -i Kernel.rpm Plist
cp:是否覆蓋“Plist”? y
注:人機交互在數-i的運用;如果源文件復制到目標文件,如果目標文件存在,則提示警告;
3.22 參數-a的示例及說明;
把源目錄復制到另外的一個目標,相當于克隆了一個目錄,源目錄和目標目錄在用戶組、權限及修改或訪問時間保持一致;
[root@localhost ~]# cp -a mydir youdir
注:復制目錄mydir 到youdir ,如果yourdir目錄不存在,則創建。并且把mydir中所有的文件下級子目錄都復制到 yourdir目錄中。也就是說mydir目錄的文件和youdir是一樣的。-a 參數等同于-dpR,并且源目錄和目標目錄的屬性(用戶組、權限、最后訪問及修改時間)都一致;
3.23 參數-b的示例應用;
把源文件復制為目標文件;并且嘗試-b參數的運用;
[root@localhost ~]# cp fonts.scale fonts.dir? 把一個文件復制為另一個文件;
[root@localhost ~]# cp -bi fonts.scale fonts.dir
cp:是否覆蓋“fonts.dir”? y? 注:因為用了-i 參數,如果目標文件存在,則報警提示;
[root@localhost ~]# ls -lh fonts.*
-rw-r--r-- 1 root root 2 04-20 10:24 fonts.dir
-rw-r--r-- 1 root root 2 04-20 10:24 fonts.dir~? 注:-b參數運用的效果就是生成已存在目標文件的覆蓋之前備份。
-rw-r--r-- 1 root root 2 03-27 02:00 fonts.scale
3.24 把多個文件復制到目錄目錄中示例;
比如我們把位于用戶當前目錄下的fonts.dir、Kernel.rpm和Plist文件,復制到當前用戶所處的目錄下的sun目錄中;
[root@localhost ~]# pwd? 注:判斷用戶所處的位置,也就是所處的目錄;
/root
[root@localhost ~]# mv fonts.dir Kernel.rpm? Plist? sun/
[root@localhost ~]# ls sun/
fonts.dir? Kernel.rpm? Plist
注:如果您想把多個目錄或文件復制到目標目錄時,您得加參數 -R
3.25 復制目錄時-R參數的應用;
復制一個目錄到另一個目錄時,我們要用到 -r或-R 或-a , 如果目標目錄不存在,則創建它,如果目標目錄存在,則復制源目錄到目標目錄之下;看看-a和-R或-r有什么不同?嘗試看看;
比如我們在用戶當前操作的目錄中,有mydir目錄,我們想把mydir復制為medir(在復制之前medir是不存在的)。
[root@localhost ~]# cp -R mydir medir 注:如果medir目錄不存在,則創建medir目錄,并且medir目錄中的內容和mydir中的一樣;
如果您把-R參數換成-a參數,會有什么不同?看看前面的例子所說的;
4、 目錄創建工具mkdir和刪除空目錄工具rmdir;
4.1 mkdir 是目錄創建工具;
4.11 mkdir語法格式及參數;
語法格式
#mkdir [參數選項]? 目錄
參數常用的如下:
-m 在創建目錄時要授其權限,要和chmod的授權格式;
-p 如果中間目錄不存在,則創建它
4.12 參數 -p 的應用示例
我們要創建一個目錄linuxsir,并且linuxsir目錄下包含子目錄sirdoc,sirdoc目錄下還有 redhat目錄;
[root@localhost ~]# mkdir -p? linuxsir/sirdoc/redhat
舉例: -m 參數的應用示例;
我們以不同的權限來創建目錄,然后查看我們所創建目錄的屬性;這要涉及到chown 來改變目錄的權限的格式。我們會在以后講到chown改變目錄或文件的權限。在這里不同的是,在目錄創建之時就給其授權了;
[root@localhost ~]# mkdir -m? 644 sundir
[root@localhost ~]# mkdir -m 755 moondir
[root@localhost ~]# mkdir -m 000 beinandir
[root@localhost ~]# ls -ld sundir moondir beinandir
d--------- 2 root root 4096 04-20 11:01 beinandir
drwxr-xr-x 2 root root 4096 04-20 11:01 moondir
drw-r--r-- 2 root root 4096 04-20 11:00 sundir
4.2 刪除空目錄工具 rmdir 和rm ;
rmdir 是用來刪除空目錄用的,如果目錄中有文件或子目錄,必須先刪除文件或子目錄,其語法格式如下:
#rmdir [參數]? 目錄
rmdir 參數常用的有:
-p 刪除目錄時是一級一級的時行的,值得注意的是,首先從最里面的目錄開始。下面是一個例子;
[root@localhost ~]# mkdir -p? linuxsir/sirdoc/redhat/?
注:首先在當前目錄下創建linuxsir目錄,他的子目錄是sirdoc,sirdoc內又有一個子目錄redhat
[root@localhost ~]# rmdir -p linuxsir/sirdoc/redhat/? 注:刪除linuxsir目錄,要用到參數-p
[root@localhost ~]# ls linuxsir? 注:檢查一下是不是還有這個目錄?
ls: linuxsir: 沒有那個文件或目錄
rmdir 所刪除的目錄,每級目錄中都是空的,沒有其它的文件。如果任何一級的目錄有文件,也不能刪除。這時您要用到rm -rf 命令強制刪除。不過用rm -rf 刪除時有點不安全,還是用rf -ri 比較好一點,因為在刪除的時候,會有警告提示。這對于安全操作來說是很重要的;
[root@localhost ~]# ls -lh sun/? 注:這是sun目錄,里面有內容;
總計 28K
-rw------- 1 root root 1.4K 04-19 15:04 anaconda-ks.cfg
-rw-r--r-- 1 root root??? 2 04-20 10:24 fonts.dir
-rw-r--r-- 1 root root??? 2 03-27 02:00 fonts.scale
-rw-r--r-- 1 root root 5.3K 03-16 08:52 install.log.syslog
-rw-r--r-- 1 root root??? 0 04-19 20:44 Kernel.rpm
-rw-r--r-- 1 root root??? 0 04-20 10:20 Plist
[root@localhost ~]# rmdir sun/? 注:我們嘗試用rmdir來刪除,
rmdir: sun/: 目錄非空??
[root@localhost ~]# rm -rf sun/? 注:強制用rm -rf 來刪除;
[root@localhost ~]# ls sun??? 注:檢查是否刪除,刪除成功;
ls: sun: 沒有那個文件或目錄
5、創建一個空文件的工具:用 touch、echo、cat等工具;
有時我們為了方便,可能在控制臺或終端下創建一個不存在的空文件,然后我們再用編輯器來編輯它;創建空文件有時還有點用。說說也無妨。我們在這里用touch、ech0及cat 工具。其實這些工具,創建文件只是他們的一個小小的功能,我們以后再介紹這些工具,先說他們創建文件的功能。
注意:創建這些文件,在我們操作創建文件之前,這些文件在用戶當前操作目錄下是不存在的,我們在這里只是創建一個新的文件名,并且它里面沒有任何空容的;
[root@localhost ~]# ls 123456.txt 654321.txt 98765.txt
ls: 123456.txt: 沒有那個文件或目錄
ls: 654321.txt: 沒有那個文件或目錄
ls: 98765.txt: 沒有那個文件或目錄
[root@localhost ~]# echo > 123456.txt? 注:用ech0 來創建,在創建之前在此操作目錄下不存不123456.txt文件;
[root@localhost ~]# ls 123456.txt???? 注:查看一下看有沒有生成?
123456.txt
[root@localhost ~]# touch 654321.txt? 注:用 touch 來創建,在創建之前在此操作目錄下不存在654321.txt文件;
[root@localhost ~]# ls 654321.txt? 注:查看一下看有沒有生成?
654321.txt
[root@localhost ~]# cat > 98765.txt? 注:用ech0 來創建,在創建之前在此操作目錄下不存在98765.txt 文件;然后按ctrl+c組合鍵退出;
[root@localhost ~]# ls 98765.txt?? 注:查看一下看有沒有生成?
98765.txt
6、刪除文件工具rm;
rm 是用來刪除一個或多個文件的工具,并且能用于刪除非空目錄。我們前面提到了可以加參數-rf 就可以強制刪除一個非空目錄。
rm的語法格式;
#rm [參數選項] file1 file2 ... ...
#rm? [參數選項]? dir1 dir2 dir3 ... ...
rm 常用參數:
-f? 不顯示警告或提示信息就刪除,用的時候需要小心;
-i? 刪除文件時,顯示警告信息,要多用,這樣比較安全;根據提示,輸入y就表示刪除,輸入n,請示不刪除;
-r或-R? 表示可以刪除整個目錄(包括子目錄及所有文件),要小心用;
[root@localhost ~]# rm -i 123.sh? 注:這是刪除一個文件,用-i參數的示例,有警告提示;
rm:是否刪除一般空文件“123.sh”? y
比如我們想刪除mydir目錄及所有下級目錄和文件,要有提示的警告信息,可以用-r參數和-i參數的組合;如果您想終止rm命令,請按ctrl+c組合健退出rm;
[root@localhost ~]# rm -ri mydir/
rm:是否進入目錄“mydir/”? y
rm:是否進入目錄“mydir//youdir”? y
rm:是否刪除一般文件“mydir//youdir/enteruml.sh”?
如果您想沒有任何警告信息的刪除mydir目錄下的所有文件及子目錄,可以用-r和-f參數的組合;
[root@localhost ~]# rm -rf mydir
7、修改文件名工具 mv
mv 可以移動一個文件(或目錄)到另一個文件(或目錄),如果文件(或目錄)不存在,則創建它。其實mv 這個過程也可以理解為改名過程,所以說mv工具能修改文件名和目錄名。
#mv 原文件名或目錄名? 新文件或目錄名
注意:新文件名或目錄名應該不能與現有文件名(或目錄名)同名。
舉例:
[root@localhost ~]# ls
crondw.sh? kernel? mkuml-2004.07.17-ananas.tar.bz2? mydir? openQreadme.txt? sun.txt? upgrade.log? youdir
[root@localhost ~]# mv crondw.sh 123.sh? 注:移動crondw.sh 到123.sh ,其實就是把文件名改為了123.sh
[root@localhost ~]# ls
123.sh? kernel? mkuml-2004.07.17-ananas.tar.bz2? mydir? openQreadme.txt? sun.txt? upgrade.log? youdir
再看一例mv 修改目錄的。當然mv是把文件(或目錄)從一個地方移到另一個地方。如果另一地方沒有和源文件(或目錄)同名的,就創建。這也相當于改名;
[root@localhost ~]# ls
123.sh? kernel? mkuml-2004.07.17-ananas.tar.bz2? mydir? openQreadme.txt? sun.txt? upgrade.log? youdir
[root@localhost ~]# mv kernel/ kernelBak
[root@localhost ~]# ls
123.sh? kernelBak? mkuml-2004.07.17-ananas.tar.bz2? mydir? openQreadme.txt? sun.txt? upgrade.log? youdir
下面我們來看看Jakarta-ORO庫的一些應用實例。 |
3.1 日志文件處理 |
任務:分析一個Web服務器日志文件,確定每一個用戶花在網站上的時間。在典型的BEA WebLogic日志文件中,日志記錄的格式如下: |
![]() |
分析這個日志記錄,可以發現,要從這個日志文件提取的內容有兩項:IP地址和頁面訪問時間。你可以用分組符號(圓括號)從日志記錄提取出IP地址和時間標記。 |
首先我們來看看IP地址。IP地址有4個字節構成,每一個字節的值在0到255之間,各個字節通過一個句點分隔。因此,IP地址中的每一個字節有至少一個、最多三個數字。圖八顯示了為IP地址編寫的正則表達式: |
![]() |
圖八:匹配IP地址 |
IP地址中的句點字符必須進行轉義處理(前面加上“\”),因為IP地址中的句點具有它本來的含義,而不是采用正則表達式語法中的特殊含義。句點在正則表達式中的特殊含義本文前面已經介紹。 |
日志記錄的時間部分由一對方括號包圍。你可以按照如下思路提取出方括號里面的所有內容:首先搜索起始方括號字符(“[”),提取出所有不超過結束方括號字符(“]”)的內容,向前尋找直至找到結束方括號字符。圖九顯示了這部分的正則表達式。 |
![]() |
圖九:匹配至少一個字符,直至找到“]” |
現在,把上述兩個正則表達式加上分組符號(圓括號)后合并成單個表達式,這樣就可以從日志記錄提取出IP地址和時間。注意,為了匹配“- -”(但不提取它),正則表達式中間加入了“\s-\s-\s”。完整的正則表達式如圖十所示。 |
![]() |
圖十:匹配IP地址和時間標記 |
現在正則表達式已經編寫完畢,接下來可以編寫使用正則表達式庫的Java代碼了。 |
為使用Jakarta-ORO庫,首先創建正則表達式字符串和待分析的日志記錄字符串: |
![]() |
這里使用的正則表達式與圖十的正則表達式差不多完全相同,但有一點例外:在Java中,你必須對每一個向前的斜杠(“\”)進行轉義處理。圖十不是Java的表示形式,所以我們要在每個“\”前面加上一個“\”以免出現編譯錯誤。遺憾的是,轉義處理過程很容易出現錯誤,所以應該小心謹慎。你可以首先輸入未經轉義處理的正則表達式,然后從左到右依次把每一個“\”替換成“\\”。如果要復檢,你可以試著把它輸出到屏幕上。 |
初始化字符串之后,實例化PatternCompiler對象,用PatternCompiler編譯正則表達式創建一個Pattern對象: |
![]() |
現在,創建PatternMatcher對象,調用PatternMatcher接口的contain()方法檢查匹配情況: |
![]() |
接下來,利用PatternMatcher接口返回的MatchResult對象,輸出匹配的組。由于logEntry字符串包含匹配的內容,你可以看到類如下面的輸出: |
![]() |
3.2 HTML處理實例一 |
下面一個任務是分析HTML頁面內FONT標記的所有屬性。HTML頁面內典型的FONT標記如下所示: |
![]() |
程序將按照如下形式,輸出每一個FONT標記的屬性: |
![]() |
在這種情況下,我建議你使用兩個正則表達式。第一個如圖十一所示,它從字體標記提取出“"face="Arial, Serif" size="+2" color="red"”。 |
![]() |
圖十一:匹配FONT標記的所有屬性 |
第二個正則表達式如圖十二所示,它把各個屬性分割成名字-值對。 |
![]() |
圖十二:匹配單個屬性,并把它分割成名字-值對 |
分割結果為: |
![]() |
現在我們來看看完成這個任務的Java代碼。首先創建兩個正則表達式字符串,用Perl5Compiler把它們編譯成Pattern對象。編譯正則表達式的時候,指定Perl5Compiler.CASE_INSENSITIVE_MASK選項,使得匹配操作不區分大小寫。 |
接下來,創建一個執行匹配操作的Perl5Matcher對象。 |
![]() |
假設有一個String類型的變量html,它代表了HTML文件中的一行內容。如果html字符串包含FONT標記,匹配器將返回true。此時,你可以用匹配器對象返回的MatchResult對象獲得第一個組,它包含了FONT的所有屬性: |
![]() |
接下來創建一個PatternMatcherInput對象。這個對象允許你從最后一次匹配的位置開始繼續進行匹配操作,因此,它很適合于提取FONT標記內屬性的名字-值對。創建PatternMatcherInput對象,以參數形式傳入待匹配的字符串。然后,用匹配器實例提取出每一個FONT的屬性。這通過指定PatternMatcherInput對象(而不是字符串對象)為參數,反復地調用PatternMatcher對象的contains()方法完成。PatternMatcherInput對象之中的每一次迭代將把它內部的指針向前移動,下一次檢測將從前一次匹配位置的后面開始。 |
本例的輸出結果如下: |
![]() |
3.3 HTML處理實例二 |
下面我們來看看另一個處理HTML的例子。這一次,我們假定Web服務器從widgets.acme.com移到了newserver.acme.com。現在你要修改一些頁面中的鏈接: |
![]() |
執行這個搜索的正則表達式如圖十三所示: |
![]() |
圖十三:匹配修改前的鏈接 |
如果能夠匹配這個正則表達式,你可以用下面的內容替換圖十三的鏈接: |
![]() |
注意#字符的后面加上了$1。Perl正則表達式語法用$1、$2等表示已經匹配且提取出來的組。圖十三的表達式把所有作為一個組匹配和提取出來的內容附加到鏈接的后面。 |
現在,返回Java。就象前面我們所做的那樣,你必須創建測試字符串,創建把正則表達式編譯到Pattern對象所必需的對象,以及創建一個PatternMatcher對象:![]() |
接下來,用com.oroinc.text.regex包Util類的substitute()靜態方法進行替換,輸出結果字符串: |
![]() |
Util.substitute()方法的語法如下: |
![]() |
這個調用的前兩個參數是以前創建的PatternMatcher和Pattern對象。第三個參數是一個Substiution對象,它決定了替換操作如何進行。本例使用的是Perl5Substitution對象,它能夠進行Perl5風格的替換。第四個參數是想要進行替換操作的字符串,最后一個參數允許指定是否替換模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替換指定的次數。 |
我們先從簡單的開始。假設你要搜索一個包含字符“cat”的字符串,搜索用的正則表達式就是“cat”。如果搜索對大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是說: |
![]() |
1.1 句點符號 |
假設你在玩英文拼字游戲,想要找出三個字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結束。另外,假設有一本英文字典,你可以用正則表達式搜索它的全部內容。要構造出這個正則表達式,你可以使用一個通配符——句點符號“.”。這樣,完整的表達式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”,還有其他許多無意義的組合。這是因為句點符號匹配所有字符,包括空格、Tab字符甚至換行符: |
![]() |
1.2 方括號符號 |
為了解決句點符號匹配范圍過于廣泛這一問題,你可以在方括號(“[]”)里面指定看來有意義的字符。此時,只有方括號里面指定的字符才參與匹配。也就是說,正則表達式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因為在方括號之內你只能匹配單個字符: |
![]() |
1.3 “或”符號 |
如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意義就是“或”運算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正則表達式。這里不能使用方擴號,因為方括號只允許匹配單個字符;這里必須使用圓括號“()”。圓括號還可以用來分組,具體請參見后面介紹。 |
![]() |
1.4 表示匹配次數的符號 |
表一顯示了表示匹配次數的符號,這些符號用來確定緊靠該符號左邊的符號出現的次數: |
![]() |
假設我們要在文本文件中搜索美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的正則表達式如圖一所示。在正則表達式中,連字符(“-”)有著特殊的意義,它表示一個范圍,比如從0到9。因此,匹配社會安全號碼中的連字符號時,它的前面要加上一個轉義字符“\”。 |
![]() |
圖一:匹配所有123-12-1234形式的社會安全號碼 |
假設進行搜索的時候,你希望連字符號可以出現,也可以不出現——即,999-99-9999和999999999都屬于正確的格式。這時,你可以在連字符號后面加上“?”數量限定符號,如圖二所示: |
![]() |
圖二:匹配所有123-12-1234和123121234形式的社會安全號碼 |
下面我們再來看另外一個例子。美國汽車牌照的一種格式是四個數字加上二個字母。它的正則表達式前面是數字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。圖三顯示了完整的正則表達式。 |
![]() |
圖三:匹配典型的美國汽車牌照號碼,如8836KV |
1.5 “否”符號 |
“^”符號稱為“否”符號。如果用在方括號內,“^”表示不想要匹配的字符。例如,圖四的正則表達式匹配所有單詞,但以“X”字母開頭的單詞除外。 |
![]() |
圖四:匹配所有單詞,但“X”開頭的除外 |
1.6 圓括號和空白符號 |
假設要從格式為“June 26, 1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達式可以如圖五所示: |
![]() |
圖五:匹配所有Moth DD,YYYY格式的日期 |
新出現的“\s”符號是空白符號,匹配所有的空白字符,包括Tab字符。如果字符串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個圓括號創建一個組,然后用ORO API(本文后面詳細討論)提取出它的值。修改后的正則表達式如圖六所示: |
![]() |
圖六:匹配所有Month DD,YYYY格式的日期,定義月份值為第一個組 |
1.7 其它符號 |
為簡便起見,你可以使用一些為常見正則表達式創建的快捷符號。如表二所示: |
表二:常用符號 |
![]() |
例如,在前面社會安全號碼的例子中,所有出現“[0-9]”的地方我們都可以使用“\d”。修改后的正則表達式如圖七所示: |
![]() |
圖七:匹配所有123-12-1234格式的社會安全號碼 |
二、Jakarta-ORO庫 |
有許多源代碼開放的正則表達式庫可供Java程序員使用,而且它們中的許多支持Perl 5兼容的正則表達式語法。我在這里選用的是Jakarta-ORO正則表達式庫,它是最全面的正則表達式API之一,而且它與Perl 5正則表達式完全兼容。另外,它也是優化得最好的API之一。 |
Jakarta-ORO庫以前叫做OROMatcher,Daniel Savarese大方地把它贈送給了Jakarta Project。你可以按照本文最后參考資源的說明下載它。 |
我首先將簡要介紹使用Jakarta-ORO庫時你必須創建和訪問的對象,然后介紹如何使用Jakarta-ORO API。 |
▲ PatternCompiler對象 |
首先,創建一個Perl5Compiler類的實例,并把它賦值給PatternCompiler接口對象。Perl5Compiler是PatternCompiler接口的一個實現,允許你把正則表達式編譯成用來匹配的Pattern對象。 |