linux bash下find命令之-exec参数多次使用{}处理匹配到文件

问题:

使用find命令查询旧文件文件,并删除,但又想在删除前看一下文件名,大致监测一下进度。不过在exec参数里直接使用两次{}会报错,google后,找到方法,使用sh "代理"一下,直接上代码:

find . -atime +150 -exec sh -c 'ls -lh {} ; rm {}' \;

注意加粗着色部分及其单引号。

特殊字符比较多,转载时容易出问题,再截张图,对照参考

bash_find_match_multi_use

参考:http://blog.csdn.net/duanlove/article/details/8261677
该文还介绍了其它可选方案。

后记:前面例子,只为演示功能,事实上只要给rm 带上  -v 参数即可,感谢sdfsaf指正,如下

find . -atime +150 -exec rm -v {} \;

java jdk下载-通过海外vps快速下载jdk的方法及/抓包wget

我朝网络真牛x,连接海外很多站点速度都奇慢。印象中以前从java/oracle下载jdk还不算是太慢。今天下载macintosh os x版的jdk,竟然几乎不会动,要10个小时,这还是30M企业版电信光纤吗!找了几个国内的下载站,竟然没有,难道是oracle不让做镜像下载所致?

有个海外vps,就是本站所在的服务器,平时下载海外的东西,如果太慢,通常就使用百度网盘,或vps上下载,做个中转;有时甚至会两个一起用。

但jkd的下载链接不行,下载链接带授权参数的。

想起live http headers,抓包,看看请求里是什么东西,wget模拟请求,理论上只要参数齐就可以的。wgtet一下,发现是三次请求,通过302转向到一个带AuthParm的get参数的地址上,那就直接在vp上wget它,看行不行;如果不行,再带其它参数,反正wget 有随便加http参数的功能。竟然果然是可以下载的,省事,连其它参数都不用加了!

ok,中转下载成功。

vps速度不稳,也要20多分钟的样子,但总比10个小时强得多了,慢慢等吧,还有10M

继续阅读

git生存手册/git入门基本教程

本文针对git初学者入门之用,目标为“快速的在git世界里生存下来”。当然,生存下来是不够的,严重推荐git-scm上教程深入学习,另外git客户端、开发库、部署方案等参看git wiki

本文主要以命令行操作为主。

git安装,不多说。

linux或mac os x下,应该已经安装过了,如没有请通过yum/apt-get等安装。windows下可以使用git-scm的win32版本,自带命令行;推荐在cygwin下的git。可参考 git-scm下载合适的版本

第0步,基础知识。

git是分布式、去中心化的。通俗的说,git项目里的就是每个人都有所有版本的副本;不要服务器也能工作。

几乎所有的git的操作,都被集成到git 这个命令下,如 git add, git branch, git commit, git push 等,可以运行 git --help 浏览一下。

第一步,配置个性化的名字

运行下面的命令,配置一下你的名字与邮箱地址。注意花括号只是为了看起来方便,实际执行不要带它们,除非你的名字带花括号。但强烈不建议使用特殊符号,以免为自己挖抗!

git config --global user.name {你的名字}
git config --global user.email {你的邮箱地址}

第二步,忘掉“服务器”的概念,并搞个git库。

先不考虑服务器;尤其如果有svn使用经历的话,先忘掉这个概念。因为git是“去中心化”的,即不要服务器就可以工作。所以一开始我们先简化掉不必要的东西,有助于快速入门。

打开命令行。windows下使用git-scim者,可以在某个文件夹里点右键-Git Bash (?)。切换到一个空目录里。下面以/cygdrive/e/git_repo/foobar/ 目录为例(cygwin的目录风格)

执行命令 git init ,你将看到类似下面的提示消息

Initialized empty Git repository in /cygdrive/e/git_repo/foobar/.git/

看到了吧,git在本目录下创建了一个子目录 .git 这就是本地的git仓库。受git控制的文件的所有历史版本都会存储在这里面;本git仓库的配置也在里面。有兴趣可以到里面随便看看。有探索精神的童鞋注意了,不要指望在里面按文件找到你的文件;请在入门后了解一下git原理。

第三步,熟悉一下git环境。

回到前面创建的目录(注意不要跑到.git子目录里),运行 git status,你将看到类似如下的消息:

$ git status
On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

简单说明一下,On branch master  -> 你在 master 分支(branch)下

Initial commit  -> 当前是初始提交。刚刚初始化的一个版本库,即是空的 (别想歪,没字)。

nothing to commit (create/copy files and use "git add" to track)  ->  接上行“初始提交” 但没有任何东西待提交(创建或拷贝进来一些文件并使用git add 追踪它们)。

[提示] git status这个命令非常常用。

第四步,搞几个文件,纳入git版本库。

按照git的提示,随便搞几个文本文件,最好小一点,只有几行。从别的地方拷来也行,在这里新建也可以。

假设创建了文件  readme.txt ,内容如下3行,最后一行是空行

this is a text file
line 2 aaa
line 3 bbbbb

再运行一下git status

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        readme.txt

nothing added to commit but untracked files present (use "git add" to track)

消息变了,大意是说:

有了未追踪的文件(Untracked files):
(使用 git add <文件名> ... 把你需要追踪的文件加入进来。)
readme.txt

现在还没有添加到待提交列表里,但是有未追踪的文件,使用git add 追踪它们.

有点啰嗦.....

git 里,文件被追踪(track),就是被纳入git版本控制。每次提交(commit)就是每一次的版本变更。

那我们就按提示添加文件到追踪列表吧.

git add readme.txt

咦,没有任何消息?是的,再运行git status看看。多了如下的部分,不细讲了

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   readme.txt

第五步,首次提交一个版本

运行命令 git commit -m "first commit, file readme.txt"

本行命令有点小麻烦,因为带了个 -m 参数,后面双引号里是一段简短的说明,为本次提交加点注释,方便以后查阅。git默认强制要求每次提交都要带说明。注释随便写,但强烈建议有概括性,简洁直观的文字说明,会给你及你的团队带来帮助。

[本步下面的内容非必须,但还是建议了解一下] 如果不带 -m 参数,git默认会给你一个vim 的编辑器,并给出一些有意义的提示文字,你可以在这里写注释,然后保存退出,git会把你写的内容当作注释。

vim编辑器是神器,但入门有门槛。对于 git 提交来说,只要死记下面的步骤即可:

默认是不是打字的,要先敲一下 i 键(注意是小写状态),即可以正常输入文字。

写完确认无误后,按 Esc 键,按一次或N多次都行,如果不确定是否真的按下过,那就多几次,反正没有副作用。然后击键:

:wq

然后按回车。提交就完成了,将大概如下所示的消息。

$ git commit
[master (root-commit) fbc00df] first commit, file readme.txt
 1 file changed, 3 insertions(+)
 create mode 100644 readme.txt

啰嗦 一下,前面保存注释用的是三个键,冒号、w、q,然后回车。

第六步,做下修改,再提交一个版本

随便修改一下前述文件,然后运行 git status ,消息大概如下 :

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

说得很明白,readme.txt这个文件有修改,你可以通过 git add 添加到待提交列表。这个“待提交列表”有个名字“暂存区域”。

消息里还说,可以通过git checkout -- <file> 丢弃你做的修改。这点下一步再尝试。

执行git add readme.txt ,然后执行 git commit -m "add a new test line",完成本次提交。

第七步,体验丢弃修改功能

随便在readme.txt里修改点东西,然后git status,看到git认出来 了文件的修改。消息从略

然后执行  git checkout -- readme.txt

注意命令里的两个连字符(--) ,其前后都是有空格的。

然后再执行git status,消息如下:

$ git status
On branch master
nothing to commit, working directory clean

查看readme.txt文件,会发现你做的修改确实已经没了,恢复为上次提交时的内容。

当然,这个命令只能恢复到上次提交时的版本,要想回复到更早的版本,继续下面

第八步,历史长廊

先随便做几次提交吧,可以多建几个文件并加到追踪里。

差不多了,就通过git log 查阅提交历史,大概如下

$ git log
commit 9ab41ac68ae6fe8e0e3ccc0013af91e5d3aa0ca9
Author: fengyqf <fengyqf@gmail.com>
Date:   Thu Nov 20 21:15:55 2014 +0800

    remove a line

commit f72675d78dfa6c5a7c0a9e742fb3e5a19d9d62d7
Author: fengyqf <fengyqf@gmail.com>
Date:   Thu Nov 20 21:15:28 2014 +0800

    add serival lines

commit e063544aacdff53f4d971179720bd1f83f1f9634
Author: fengyqf <fengyqf@gmail.com>
Date:   Thu Nov 20 21:13:48 2014 +0800

    append a line

commit fbc00dfcc90e395aa0491a4aaaca7659d74b9d5d
Author: fengyqf <fengyqf@gmail.com>
Date:   Thu Nov 20 20:41:47 2014 +0800

    add some file

这里按时间倒序列出最近的提交。如果你提交次数较多,你会看到屏幕最后一行行首是一个冒号,紧跟着光标。这时,你可以按空格键查看下一屏,或 b 键返回上一屏,或Esc键退出回到命令行(shell)下。

看上面的日志,每次提交一节,每节首行是 commit 后面跟着本次提交的ID,这段id是即是版本号,当然它对人类不太友好。第二三行是提交人、时间,然后空一行接着是本次提交注释文字。

如果我们的某个文件被玩坏了,需要恢复到历史上的某个版本,那就git checkout 出来

假设需要恢复上上次提交

commit f72675d78dfa6c5a7c0a9e742fb3e5a19d9d62d7

执行 git checkout f726 readme.txt

其中 f726 是该次提交的ID前4个字符,也就是,通常我们不需要写完整的ID就可以指定某次提交。当然,你使用前5个字符或前6个或更多,都是可以的。

提交ID后台跟需要检出的文件名。注意一定要带这个“文件名”的参数,不然会出乱子:下次提交后,在该版本后的版本将会被你抹掉!

看到了吧,文件readme.txt 历史版本又回来了。

差点忘了,可以通过git checkout --help查阅帮助,其它命令,也可以同样查帮助。帮助内容自己看,这里不讲了。

第九步,分支

git最强悍的功能之一,就是它的分支,比svn彪悍得多!

是否注意到前面所说的“master”分支,这是默认分支,我们可以创建一个新的分支。

git branch -b

第十步,比较

git diff

第十一步,分支合并

git merge

第十二步,checkout --patch

git checkout --patch

第十三步,远程仓库

git remote add

git push

git fetch

git pull

windows下的php 5.3安装xdebug,竟然强制要求zend_extension写绝对地址

如题。

xdebug一直无法加载,换版本也不行;最后google得知这里要使用绝对路径。

有点不可理解,zend_extension加载扩展,竟然要求写绝对路径,跟extension指令使用相对路径还不一样。

备个忘吧。

btw,xdebug官方的安装向导,做得很赞,只是向导里没有强调必须使用绝对地址。

xdebug官方安装说明里倒是有:

---------xdebug官方安装说明 -------------------------------------------------------------------

but you still need to add the correct line to your php.ini: (don't forget to change the path and filename to the correct one — but make sure you use the full path)

zend_extension="/usr/local/php/modules/xdebug.so"

Note: You should ignore any prompts to add "extension=xdebug.so" to php.ini — this will cause problems.

 

------END of---xdebug官方安装说明 -------------------------------------------------------------------

centos 7 下rpm/yum安装inconsolata字体

inconsolata字体是一款不错的等宽字体,码代码用字体...

然而在centos 7下没有,在rhel/epel 6下的rpmforge里有这个字体,7系列竟然没了。根据“相近原则”,找6下面的字体,竟然发现它是noarch的,那就直接rpm安装了,使用华中科技大学开源镜像站的镜像

rpm -ivh http://mirrors.hustunique.com/repoforge/redhat/el6/en/x86_64/rpmforge/RPMS/inconsolata-fonts-0.1-1.el6.rf.noarch.rpm

完成。

li.nux.ro/nux: 值得使用的一个redhat el7/centos7的rpm/yum源

之前在centos 6下一直用epel+rpmfusion源,但至今(2014-09-07),rpmfusion仍没有推出centos7/rhel7下的源,所以安装软件是痛苦的事情。

对于缺少yum的软件,我习惯是在 http://rpm.pbone.net/ 上手工查找,然后找最近似改造版的下载。例如在centos下,首选找同版本centos或redhat el包,没有的话找最近似的fedora版本下载,再没有,使用前一版本的centos/rhel包,或者fedora包。

也就是在昨天或者说今天凌晨,在通过 http://rpm.pbone.net/ 手工解决依赖安装smplayer/mplayer 的过程中,发现了这个源,因为有好几个包都是之这个域名下下载的,所以直接访问了一下,竟然是一个yum源,维护者是很积极的。在此表示由衷感谢!

li.nux.ro 上目前有rhel/centos6及7两个版本的rpm/yum源,它需要依赖epel源,所以要首先配置epel源。不过正常情况下大家都会装上epel源的吧,epel是连centos官方都推荐的优质源。

使用说明,很简洁,丝毫不啰嗦,http://li.nux.ro/repos.html

另外,atrpms这个源也是值得推荐的,没有比较这两个源之间的重复度或冲突情况。对于求稳定的朋友,建议安装过需要的软件后,卸载这些第三源,以免造成系统包被替换(或许有这个可能,据说atrpms会替换系统包,毕竟rhel/epel的版本经常太老)

ms sql server下unix时间戳函数unix_timestamp, from_unixtime(与mysql兼容)

直接上代码:

CREATE FUNCTION UNIX_TIMESTAMP (@ctimestamp datetime) RETURNS integer 
AS
BEGIN
  /* Function body */
  declare @return integer
  SELECT @return = DATEDIFF(SECOND,{d '1970-01-01'}, @ctimestamp)
  return @return
END


CREATE FUNCTION from_unixtime (@ts integer) RETURNS datetime 
AS
BEGIN
  /* Function body */
  declare @return datetime
  select @return = DATEADD(second, @ts, {d '1970-01-01'})
  return @return
END

用法

跟MySQL下的一样类似:

select dbo.UNIX_TIMESTAMP('2013-1-1')
select dbo.from_unixtime(2145000000)

感谢参考 http://skinn3r.wordpress.com/2009/01/26/t-sql-datetime-to-unix-timestamp/

php函数mult_iconv:转换任意维数组的字符集编码(扩展iconv函数功能)

php的iconv函数只支持对字符串的转换编码,如果是数组,就要自己遍历转换了,因此写如上的函数,对任意维数组进行转换,同时转换下标(索引)及值。

注意:不转对象。

function mult_iconv($in_charset,$out_charset,$data)
{
    if(substr($out_charset,-8)=='//IGNORE'){
        $out_charset=substr($out_charset,0,-8);
    }
    if(is_array($data)){
        foreach($data as $key => $value){
            if(is_array($value)){
                $key=iconv($in_charset,$out_charset.'//IGNORE',$key);
                $rtn[$key]=mult_iconv($in_charset,$out_charset,$value);
            }elseif(is_string($key) || is_string($value)){
                if(is_string($key)){
                    $key=iconv($in_charset,$out_charset.'//IGNORE',$key);
                }
                if(is_string($value)){
                    $value=iconv($in_charset,$out_charset.'//IGNORE',$value);
                }
                $rtn[$key]=$value;
            }else{
                $rtn[$key]=$value;
            }
        }
    }elseif(is_string($data)){
        $rtn=iconv($in_charset,$out_charset.'//IGNORE',$data);
    }else{
        $rtn=$data;
    }
    return $rtn;
}

下载程序文件(含示例)

调用示例:

$foobar=mult_iconv('gbk','utf-8','一个数组、字符串或其它类型数据');

一个复杂一点的测试示例(不转对象)

// ******* 一个复杂一点的测试示例 ********************
class MyClass
{
    public $v1='不转对象,恭喜发财';
    public $v2='skipped object';
    public function f()
    {
        return true;
    }
}
$obj=new MyClass();

$foo=array('abcd','随便写点文字'
    ,array('中文下标'=> 789,'天地玄黄'
        =>array('宇宙洪荒'=>'赵钱孙李',300=>'恭喜发财,不转对象'
                    ,array('更深的数组'=>'照样可以转换')
                )
    )
    ,'恭喜发财,不转对象' => $obj
    ,'如需转对象'=>'Do It Yourself!'
    ,'作者很懒'=>'用不到就不写了'
    );
$bar=mult_iconv('gbk','utf-8//IGNORE',$foo);
var_dump($bar);
Pages: Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 Next