find . -iname "*.inc" -exec grep -Hn adminFooter {} \;
--------------------------------------------------
find,grep和exec的使用
find是查找文件,而grep是在文件中查找字符串。
1.man find的部分说明:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;‘ is encountered. The string `{}‘
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find. Both of these
constructions might need to be escaped (with a `‘) or quoted to
protect them from expansion by the shell. The command is exe-
cuted in the starting directory.
find . -name "*.txt"或者find . -name *.txt
在当前目录下查找*.txt文件。结果中当前目录的路径以./表示。
[root@VIAC3-03 root]# find . -name *.txt
./pet.txt
find ~ -name "*.txt"或者find . -name *.txt
在当前目录及其子目录下查找*.txt文件。结果中当前路径会显示。示例:
[root@VIAC3-03 root]# find ~ -name *.txt
/root/pet.txt
find ~ -name *.txt -exec ls -l {} ;
在当前目录及其子目录下查找*.txt文件,并将查找到的文件信息显示出来。注意:{}和之间有空格;不要少了最后的分号“;”,否则提示find: missing argument to `-exec‘,这个意思并不是说没有exec参数,而是exec后面的参数不对。示例:
[root@VIAC3-03 root]# find ~ -name *.txt -exec ls -l {} ;
-rw-r--r-- 1 root root 272 Oct 16 17:47 /root/pet.txt
find ~ -name "*.txt" -exec grep "Gwen" {} -nH ;
在当前目录中查找*.txt文件,并在这些查找到的文件的内容中搜索字符串"Gwen",将含有字符串"Gwen"的文件名(包括路径)和字符串所在行及行号显示出来。示例:
[root@VIAC3-03 root]# find ~ -name "*.txt" -exec grep "Gwen" {} -nH ;
/root/pet.txt:2:Claws Gwen cat m 1994-03-17 N
/root/pet.txt:6:Chirpy Gwen bird f 1998-09-11 N
/root/pet.txt:7:Whistler Gwen bird N 1997-12-09 N
2. grep的用法和常用选项
grep "Gwen" *.txt
在当前目录下所有.txt文件中查找字符串"Gwen"。示例:
[root@VIAC3-03 root]# grep "Gwen" *.txt
Claws Gwen cat m 1994-03-17 N
Chirpy Gwen bird f 1998-09-11 N
Whistler Gwen bird N 1997-12-09 N
grep -iH "gwen" *.txt
在当前目录下所有.txt文件中不区分大小写地查找字符串"gwen",结果中显示文件名和字符串所在行。示例:
[root@VIAC3-03 root]# grep -iH "gwen" *.txt
pet.txt:Claws Gwen cat m 1994-03-17 N
pet.txt:Chirpy Gwen bird f 1998-09-11 N
pet.txt:Whistler Gwen bird N 1997-12-09 N
常用选项:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
package wjh.android.contact;
import java.util.ArrayList;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.test.AndroidTestCase;
import android.util.Log;
/**
* 通讯录操作示例
*
*/
public class ContactTest extends AndroidTestCase {
private static final String TAG = "ContactTest";
/**
* 获取通讯录中所有的联系人
*/
public void testGetContacts() throws Throwable {
ContentResolver contentResolver = this.getContext().getContentResolver();
String uriStr = "content://com.android.contacts/contacts";
Uri uri = Uri.parse(uriStr);
Cursor cursor = contentResolver.query(uri, null, null, null, null);
// 遍历联系人
while (cursor.moveToNext()) {
// 联系人 ID
int contactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
// 联系人显示名称
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
// 联系人电话号码需要对另一个表进行查询,所以用到另一个 uri:content://com.android.contacts/data/phones
Cursor phones = getContext().getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " // 根据上一步获取的联系人 id 来查询
+ contactId, null, null);
String phone = "";
while (phones.moveToNext()) {
// "data1"字段,所以此处也可以直接写 "data1",但不推荐
phone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
// 再查询 Email。uri 为 : content://com.android.contacts/data/emails
Cursor emails = getContext().getContentResolver().query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = "
+ contactId, null, null);
while (emails.moveToNext()) {
/* 一样是 "data1" 字段。现在明白了吧?一个联系人的信息,其实被分成了好几条记录来保存,data1分别保存了各种重要的信息。
* 是时候参照打开数据库我前面所说,去瞄一眼它的表结构了!
*/
String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
Log.i("RongActivity", "emailAddress=" + emailAddress);
}
emails.close();
Log.i(TAG, "Contact [contactId= "+ contactId +"name=" + name + ", phone=" + phone + "]");
}
}
/**
* 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
* 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见
*/
public void testInsert() {
ContentValues values = new ContentValues();
//首先向RawContacts.CONTENT_URI执行一个空值插入(raw_contacts 表), 为了获取生成的联系人 ID
Uri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values);
//然后获取系统返回的rawContactId , 就是新加入的这个联系人的 ID
long rawContactId = ContentUris.parseId(rawContactUri);
/* Andorid 中,将联系人的姓名、电话、Email
* 分别存放在 data 表的同一个字段的三条记录当中
* 因此要 Insert 三次 */
//往data表入姓名数据
values.clear();
// raw_contacts_id 字段,是 raw_contacts表id 的外键,用于说明此记录属于哪一个联系人
values.put(Data.RAW_CONTACT_ID, rawContactId);
// mimitype_id 字段,用于描述此数据的类型,电话号码?Email?....
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); // 注意查看第二个参数的常量值
values.put(StructuredName.GIVEN_NAME, "文白菜"); // 这个名字真好听
this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
//往data表入电话数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, "15101689230");
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
//往data表入Email数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
values.put(Email.DATA, "wenlin56@sina.com");
values.put(Email.TYPE, Email.TYPE_WORK);
this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
}
/**
* 在同一个事务当中保存联系人
*/
public void testSave() throws Throwable{
//文档位置:reference/android/provider/ContactsContract.RawContacts.html
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.build());
//文档位置:reference/android/provider/ContactsContract.Data.html
ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.GIVEN_NAME, "文萝卜")
.build());
// 更新手机号码:Data.RAW_CONTACT_ID 获取上一条语句插入联系人时产生的 ID
ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, "15101689231") // "data1"
.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
.withValue(Phone.LABEL, "手机号")
.build());
ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
.withValue(Email.DATA, "wenlin56@yahoo.cn")
.withValue(Email.TYPE, Email.TYPE_WORK)
.build());
// 批量插入 -- 在同一个事务当中
ContentProviderResult[] results = this.getContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
for(ContentProviderResult result : results){
Log.i(TAG, result.uri.toString());
}
}
}
1.触摸屏事件—— Touch events
tap
Triggers after a quick, complete touch event.
本人实际测试效果:轻轻点击,效果和按普通按钮差不多。
taphold
Triggers after a held complete touch event (close to one second).
本人实际测试效果:按住一会儿,大约1秒,即触发。很顶用。
swipe
Triggers when a horizontal drag of 30px or more (and less than 20px vertically) occurs within 1 second duration.
本人实际测试效果:不懂,不会用
swipeleft
Triggers when a swipe event occurred moving in the left direction.
本人实际测试效果:在触摸屏幕上向左滑动,很好用。
PS:在电脑上你也可以用,按住鼠标向左拖就可以了。
swiperight
Triggers when a swipe event occurred moving in the right direction.
本人实际测试效果:在触摸屏幕上向右滑动,很好用。
PS:在电脑上你也可以用,按住鼠标向右拖就可以了。
使用方法:用live或者bind绑定到dom元素上即可,我是这么用的(以下的类似):
$('#wlist').live('swipeleft',function(){
changepage('up');
});
2.重力感应事件—— Orientation change event
orientationchange
Triggers when a device orientation changes (by turning it vertically or horizontally). When bound to this event, your callback function can leverage a second argument, which contains an orientationproperty equal to either "portrait" or "landscape". These values are also added as classes to the HTML element, allowing you to leverage them in your CSS selectors. Note that we currently bind to the resize event when orientationChange is not natively supported.
对应于手机上重力感应功能,当显示效果从垂直变为水平,或由水平变为垂直时触发。本人没用上该效果。
3.滚动条事件——Scroll events
scrollstart
Triggers when a scroll begins. Note that iOS devices freeze DOM manipulation during scroll, queuing them to apply when the scroll finishes. We're currently investigating ways to allow DOM manipulations to apply before a scroll starts.
个人测试效果:当滚动条触发时使用。
scrollstop
Triggers when a scroll finishes.
个人测试效果:当滚动条停止时使用,利用这个你可以让其返回当前滚动条的位置信息并记录下来。
$('body').live('scrollstop',function(){
$(‘#hidescroll’).val( $(this).scrollTop );
});
上面用一个ID名为hidescroll的影藏hidden控件保存了当前滚动条的位置信息。如果想使用后退页面时返回当前滚动条的位置,就请把这个hidescroll的值一并传输过去吧,不论是用get还是post。并且记得在页面写上:
$(document).ready(function(){ // document.body.scrollTop = $(‘#hidescroll’).val();});
4 页面显示影藏事件——Page show/hide events
pagebeforeshow
Triggered on the page being shown, before its transition begins.
pagebeforehide
Triggered on the page being hidden, before its transition begins.
pageshow
Triggered on the page being shown, after its transition completes.
pagehide
Triggered on the page being hidden, after its transition completes.
这四个事件的好处是,在页面的加载过程中你可以干些事。
比如,在加载的时候添加loading画面:
$('div').live('pagebeforeshow',function(){$.mobile.pageLoading();});
在加载完成后影藏loading画面:
$('div').live('pageshow',function(){$.mobile.pageLoading(true);});
5. 页面创建事件:Page initialization events
pagebeforecreate
Triggered on the page being initialized, before initialization occurs.
pagecreate
Triggered on the page being initialized, after initialization occurs.
有时候你会遇到这种情况:一个页面,已经填写了一些自定义信息,你需要依靠这些信息初始化一个新页面。我遇到的例子是,我的文件列表一刷新,点击其中任意一个文件可以显示一个对话框,这个对话框要显示你点击的这个文件的名字,和其他操作。新页面并不知道你点的是哪个文件,总不能再查询一遍吧?这个时候你就需要Page initialization events事件了,把你点击的文件名传过去。
$('#aboutPage').live('pagebeforecreate',function(event){ alert('This page was just inserted into the dom!'); }); $('#aboutPage').live('pagecreate',function(event){ alert('This page was just enhanced by jQuery Mobile!'); });
上面是jquerymobile官网给出的两个例子,,允许你操纵一个页面pre-or-post初始化,相对于页面显示/隐藏事件,创建事件只会在初始化网页的时起作用。
值得注意的是,在Jquerymobile 1.0a2版本,加载对话框等东西进来,实际是用ajax方法将对话框以div role="page"模式加入当前页面。这个新加入的div,用ID保存它被ajax进来时的路径。
例如,我的主页mian.php有一个a标签:
<a href="/blog_article/dialog/search.html" type="GBK" data-rel="dialog" data-transition="slide" data-icon="search" data-iconpos="top" >简单搜索</a>
点击这个标签的结果是,在mian.php中,被ajax加入了一个id="dialog/search.php"的div,这个div, role="page",其内容就是文件search.php中body里的内容。
这样做,导致当下次再点击同一个连接的时候,实际相当于显示已被加载进来的page,加载速度当然很快。但是,这意味着你的ID属性已经不再是原来页面的一部分,而是当前页面的一个div,所以你必须记住当绑定到页面,pagecreate事件(pagebeforecreate等等)。避免这个问题的方法是用class代替id。好在我在我的程序里几乎没有遇到这个问题,因为我根本没有用Page initialization events事件,在初始化一些对话框的时候,我在主页的JS中做操作,修改对话框中的元素(因为我知道这些对话框显示的时候就已经是主页的一个div了,我要的ID总会找到)。不过这样做的结果是,Jquerymobile 1.0a3版本导致了我所有对话框的失效……算了,哥不更新了, 等beta版出来还不行么。
6。常用函数、方法
显示或影藏jquery自带的loading画面
//cue the page loader
$.mobile.pageLoading();
//hide the page loader
$.mobile.pageLoading( true );
跳转到另一个页面上
//transition to the "about us" page with a slideup transition
$.mobile.changePage("about/us.html", "slideup");
//transition to the "search results" page, using data from a form with an ID of "search""
$.mobile.changePage({ url: "searchresults.php", type: "get", data: $("form#search").serialize() });
//transition to the "confirm" page with a "pop" transition without tracking it in history $.mobile.changePage("../alerts/confirm.html", "pop", false, false);
设置滚顿条位置
//scroll to Y 100px
$.mobile.silentScroll(100);
设置根据显示时宽度的最大最小信息设置html断点,我没用过,我猜会让断点以后的html不显示。$.mobile.addResolutionBreakpoints (method)Add width breakpoints to the min/max width classes that are added to the HTML element.
//add a 400px breakpoint
$.mobile.addResolutionBreakpoints(400);
//add 2 more breakpoints
$.mobile.addResolutionBreakpoints([600,800]);
除此以外还有其他一些方法,我都没用过,也没需要去用。等beta1的文档出来了再看吧。
jqmData(), jqmRemoveData(), and jqmHasData() (method)
$.mobile.path (methods, properties)Utilities for getting, setting, and manipulating url paths. TODO: document as public API is finalized.
$.mobile.base (methods, properties)Utilities for working with generated base element. TODO: document as public API is finalized.
$.mobile.activePage (property)