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

 

 

 

wget-jdk

 

你都看到这里了,看来也是到处找着要下载jdk的,那点这里吧,只有苹果版的,其它版本有时间再搞

百度网盘下载链接:  http://pan.baidu.com/s/1gdH3xNt

提取密码  wx91

本站vps上的下载地址   http://n.path8.net/test/jdk-8u31-macosx-x64.dmg

yum更新遇到依赖错误的处理经验总结

redhat系列linux系统的yum,有时会出现错误的依赖,用linux早期,遇到该类问题简直是束手无策,无奈之下会在yum的“教唆“下使用“--skip-broken”参数,有时确实可以解决问题,但有时的后果,可以把系统玩儿坏,下次启动无法启动,或出现其它莫名其妙的问题。

列一个典型的错误依赖消息如下:

--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libva1-1.3.1-11.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libmad0-0.15.1b-4.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 librtmp0-2.3-1.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libx264_142-0.142-20_20140406.2245.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libxvidcore4-1.3.2-15.el7.x86_64 需要
.......
错误:软件包:libmad0-0.15.1b-4.el7.x86_64 (@atrpms)
          需要:/usr/sbin/ldconfig
          正在删除: glibc-2.17-55.el7_0.1.i686 (@updates)
              未找到
          更新,由: glibc-2.17-55.el7_0.3.i686 (updates)
              未找到
错误:软件包:librtmp0-2.3-1.el7.x86_64 (@atrpms)
          需要:/usr/sbin/ldconfig
          正在删除: glibc-2.17-55.el7_0.1.i686 (@updates)
              未找到
          更新,由: glibc-2.17-55.el7_0.3.i686 (updates)
              未找到
 您可以尝试添加 --skip-broken 选项来解决该问题
 您可以尝试执行:rpm -Va --nofiles --nodigest

看到了最后两行了吧,通常别听信它,小心!

为了优雅的处理类似错误依赖的问题,要搞先了解一下该问题的原因。通常是在自己手动安装了一些非官方rpm包,或使用了多个yum源所致。尤其是升级安装了新版本的包。例如,在centos里为了安装某些软件而使用fedora里的包升级了系统自带的包。

个人经验如下:

先移除/etc/yum.repo.d/下非系统官方的源,备份到其它目录里,处理好问题后还移回来继续用。

yum list 查看系统都有哪些源的包,除了@base @anaconda @updates 之外的,都要留意一下,按“靠谱”程度从低到高逐渐移除。这里的“靠谱程度”,要凭一些经验的。 如本文前面列出错误依赖的这个例子,本人用了好多个源的包,@epel @atrpms  @nux-dextop @google-chrome 等这几个第三方源,epel是很高质量的,google-chrome 只有chrome浏览器,其它几个就是不太靠谱的,先移除它们。

检查yum list列出的包名,是否用了fedora,或非本机架构的等的包(如x64系统下686的包),yum erase移除它们。卸载包时,注意着,别把重要的系统包卸载了。千万别这样带-y 参数据 yum erase  {包名}  -y,yum erase 卸载某个包时,系统提示会提示都移除哪些包,如果看着不对劲就按 N

最后,你会找到出问题的那个包名,即提示错误依赖的信息
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libbluray1-0.4.0-6.el7.x86_64 需要
--> 解决依赖关系完成
错误:软件包:libbluray1-0.4.0-6.el7.x86_64 (@atrpms)
          需要:/usr/sbin/ldconfig
          正在删除: glibc-2.17-55.el7_0.1.x86_64 (@updates)
              未找到
          更新,由: glibc-2.17-55.el7_0.3.x86_64 (updates)
              未找到
 您可以尝试添加 --skip-broken 选项来解决该问题
 您可以尝试执行:rpm -Va --nofiles --nodigest

会类似上面所示,只是少数一两个包,尝试卸载一下看看

[root@fsc ~]# rpm -e libbluray1-0.4.0-6.el7.x86_64
错误:依赖检测失败:
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-fuse-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-afc-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-gphoto2-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-goa-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-mtp-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-smb-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-afp-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-archive-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) libbluray-0.4.0-6.el7.x86_64 需要
    libbluray1 = 0.4.0-6.el7 被 (已安裝) libbluray-0.4.0-6.el7.x86_64 需要

那查查系统里该包是什么版本吧 rpm -q {包名}

上面例子里,该包是atrpms源的包,比centos源里的包新。回忆时当时为了安装smplayer,装了一系列atrpms的包。而印象中,atrpms源有时会升级centos的包,所以就造成了yum update 升级系统时造成错误依赖。到centos镜像里下载这个rpm包,rpm --force  -Uvh {包文件路径}覆盖安装一下,然后再yum更新试试。

如果没有问题,那就好了。再把yum 源的配置文件移回去,重新yum makecache,然后根据刚才卸载的包的记录,把它们安装上;可参考history 命令的记录.

大概就是这样,写得有点乱。

cygwin下一些包名与命令不一致的包的安装(telnet,dig,netstat等)及ping方案

cygwin下有一些命令,按命令名在setup里搜索不到的,每次安装都要google,汇总记录备忘于此。

telnet, 包名 inetutils ,属于 Net 类

dig, 包名 bind-utils ,属于 Net 类

可以使用windows版代替的包

win32默认是ansi/gbk编码,默认输出是乱码,可以使用iconv转换一下

ping,nslookup

中文windows环境下ping乱码方案参看本文后

cygwin里没有,或暂时还没找方案的包

netstat, 好像没有这个工具,使用windows的版本吧....

nslookup

windows版工具输出乱码的解决方案

ping,nslookup等工具只能使用windows版的,但是windows默认是本地化ansi编码,在cygwin下显示为乱码。更麻烦的是,因为乱码内容骗死人不偿命,看下图里的ip地址cygwin_ping 看ip地址被煞有其事的显示成什么样子!

解决方案如下:

新建一个文件 /usr/local/bin/ping

#!/usr/bin/env bash
ping.exe $* |iconv -c -f gbk -t utf-8

创建一个符号链接,并赋执行权限

chmod +x /usr/local/bin/pin

重新打开cygwin的shell

其他有用软件的包

Scheme解释器(lisp方言Scheme的运行环境):chicken

chicken: A practical and portable scheme system. 在setup中搜索sheme搜不出来中,要搜索chicken.  The CHICKEN Scheme interpreter.

GNU common lisp解释器,直接搜索clisp即可搜索出来。

在cygwin里调用windows版git-scm的gitk/git-scm与cygwin协同工作

20161216更新:

如果安装了git-scm的  Git-2.11.0-64-bit.exe,将如下命令加入~/.bashrc,重启cygwin即可(32位版本及以后的新版本应该是类似的)。

alias gitk='/cygdrive/d/Program\ Files/Git/cmd/gitk.exe'

假设git-scm安装在 D:\Program Files\Git

上面命令是把gitk别名到windows版gitk的程序位置。


git-scm windows版的安装选项

以从 git-scm官方下载的Git-2.11.0-64-bit安装为例,典型的windows程序安装流程,可以一路下一步到底;不过有几步强烈建议按下面的选择

安装位置 ,推荐安装到D盘;重装windows后git还可直接使用

windows shelll集成选项。如果平时主要使用cygwin里的命令行版git、windows版只使用gitk看版本历史(推荐),建议全部取消选择。当然这里也可以保持默认选项。

强烈建议选第一项,只在Git Bash里使用git。强烈反对在windows cmd中使用git。推荐平台使用cygwin里的命令行版git。

强烈建议选第三项,不要让git自作聪明的修改换行风格,以避免被同伴鄙视+痛恨!

保持默认。强烈反对在windows cmd中使用git bash。事实上更推荐使用cygwin里的shell bash


旧文章归档

下面是操作方法适合早期版本,具体截止哪个版本号不明;内容是2014年底所写。

[标题] 在cygwin里调用windows版git-scm的gitk/git-scm与cygwin协同工作

-----------本文前面部分废话比较多,可以直接跳过前五段,阅读下一条分隔线后--------------------

前言

cygwin作为潜伏在windows里的类unix/linux操作系统,堪称神器,几乎可以运行一切unix工具,甚至连gui版的unix软件也可以用cygwin-X模拟。但是这个X实在太丑陋了,使用也不方便。不过,事实上,我们用cygwin主要是使用grep, cut, vim, git 等这些经典的的unix工具,而不是gui;毕竟gui也不是unix/linux的擅长项。

对于使用git的朋友,应该更依赖cygwin下的命令行版git,自由,快捷,随心所欲。然而要查阅版本历史时,还是gui版的git更直观。

而windows版git-scm自带了git gui/gitk工具,可以在git bash里运行gitk调用,这点与unix/linux下的git一致,使用还是比较方便的;但git bash有个硬伤,工具太少,而且shell太傻,完全是windows命令提示符的风格,通过鼠标做选择复制等操作,几乎是脑残得令人无语;比cygwin差了N个星系的距离。

于是:如果能在cygwin直接调用win32下git-scm的gitk,就完美了。

然而,一直没有找到方法,连万能的google也没帮上忙。经过艰苦卓绝的不懈努力,终于找到了办法,并发现多次尝试错误的原因。

----------------- 前面废话多;下面是原理,不想看可跳到下条分隔线(十段之后) ------------

原理简析

假设win32版git-scm装在 D:\Program Files\Git ,那么gitk位于 D:\Program Files\Git\bin\gitk 该文件是一个bash风格的脚本,它是由D:\Program Files\Git\bin\wish.exe 所调用执行的。

在windows开始菜单的git子项里,查看“git gui”的属性,会发现它是一个快捷方式,指向 "D:\Program Files\Git\bin\wish.exe" "d:\Program Files\Git\libexec\git-core\git-gui"  其中的gui-gui同样也是个bash风格的脚本,由wish调用。

因为cygwin本身支持windows原生的win32程序,执行该wish.exe并带上相应的参数,就可以调用这些bash风格脚本。

原理就是如上这些。我们按照cygwin风格重写这些命令。

在cygwin里,windows盘符挂载到/cygwin/下,形式如/cygdrive/c, /cygdrive/d ... 那么,上述wish.exe 在cygwin里,路径即

/cygdrive/d/Program\ Files/Git/bin/wish.exe
路径中的空格,要做转义。

后面要带上参数,这个参数要使用windows风格的路径,因为wish.exe是win32程序,它的参数是win32风格的。gtk的脚本即如下

/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"

wish的参数加了双引号,这也是win32风格。可以在cygwin下切换到一个git项目目录里,执行上面的命令测试一下。

以cygwin里创建一个命令别名 gitk 到上面的命令上,如下

$ alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

然后执行gitk即可,与git-scm的bash环境里执行gitk一样。不过这只能在本次会话中有效,将其放到 ~/.bashrc 里,后面增加如下一行

alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

大功告成。

如果需要在cygwin里使用git gui的话,方法类似。

-----------------只想看解决方案者,可以直接从这里开始看 --------------------

一句话操作

假设win32版git-scm装在 D:\Program Files\Git  .  在cygwin里修改 ~/.bashrc 文件,追加如下一行:

$ alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

保存后,启动cygwin即可。

如果不明白,建议看前文的原理部分

磁盘空间爆掉时nginx报错 An error occurred

nginx报错了,消息如下错误如下nginx_Error_disk_empty

An error occurred.

Sorry, the page you are looking for is currently unavailable.
Please try again later.

If you are the system administrator of this resource then you should check the error log for details.

Faithfully yours, nginx.

1分钟前还是好的,至少wordpress后台可以正常打开,突然就成这样子了。静态页面还正常,就ssh上,检查php-fpm进程是正常的,没有僵局。算了,杀死,连nginx一起杀死,虽然这是很不优雅的行为,所不齿的行为。然而结果是没用。随手查了下df -h ,分区满了,怪不得,查了下,删除几个备份文件,然后一切恢复正常了。空间不够,还是个问题,要进一步清理了。

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

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ... 45 46 47 Next