Shell脚本入门:Linux文件管理系统秘籍
Shell脚本入门:Linux文件管理系统秘籍
dong4j通过端口号获取对应的 PID
1 | /usr/sbin/lsof -n -P -t -i :$TOMCAT_WEB_PORT |
根据名称获取 PID
1 | ps -ef | grep -w java | grep -v grep | awk '{print $2}' |
tar
1 | .tar.gz 和 .tgz |
shell 执行多个命令
每个命令之间用
;
隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,
但不保证每个命令都执行成功。每个命令之间用
&&
隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。每个命令之间用
||
隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功
一条命令为止
查看历史命令
1 | history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10 |
批量杀进程
1 | ps -ef|grep LOCAL=NO | grep -v grep | awk '{print $2}' |xargs kill -9 |
管道符 “|” 用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。下面说说用管道符联接起来的
几个命令:
- “ps - ef”: 是 Red Hat 里查看所有进程的命令。这时检索出的进程将作为下一条命令 “grep LOCAL=NO” 的输入。
- “grep LOCAL=NO” : 的输出结果是,所有含有关键字 “LOCAL=NO” 的进程,这是 Oracle 数据库中远程连接进程的共同特点。
- “grep -v grep” : 是在列出的进程中去除含有关键字 “grep” 的进程。
- “xargs kill -9” : 中的 xargs 命令是用来把前面命令的输出结果(PID)作为 “kill -9” 命令的参数,并执行该令。
- “kill -9” : 会强行杀掉指定进程,这样就成功清除了 oracle 的所有远程连接进程。其它类似的任务,只需要修改 “grep LOCAL=NO” 中的关键字部分就可以了。
1 | ps -ef|grep /usr/local/apache-tomcat-document/|grep -v grep|cut -c 9-15|xargs kill -9 |
批量删除
1. 删除指定文件
要删除一个特定名称的文件,可以使用以下 rm
命令:
1 | rm 文件名 |
如果要删除一个目录及该目录下的所有文件和子目录,可以带上 -r
或 -R
选项(它们是等价的):
1 | rm -rf 目录名 |
2. 使用 find
命令
find
命令可以用来查找文件或目录。结合其他命令如 grep
或 awk
,你可以进一步筛选出需要删除的文件。
例如,要删除当前目录下所有 .txt
文件,除了 test.txt
,可以使用以下命令:
1 | rm `ls *.txt | egrep -v 'test.txt'` |
或者使用 awk
:
1 | rm `ls *.txt | awk '{if($0 != "test.txt") print $0}'` |
要排除多个文件,你可以用管道符 |
结合 egrep
命令:
1 | rm `ls *.txt | egrep -v '(test.txt|fff.txt|ppp.txt)'` |
3. 删除日志文件
如果你需要删除特定日期范围内的 .log
文件,可以使用 find
和 grep
:
1 | rm -f `find . -name '*.log' | grep '2010-09-06.log'` |
4. 删除目录下的所有 .exe
文件
要删除指定目录下所有的 .exe
文件,可以使用以下命令:
1 | find . -name '*.exe' -type f -print -exec rm -rf {} ; |
在这个命令中:
.
表示从当前目录开始递归查找。-name '*.exe'
根据名称来查找,要查找所有以.exe
结尾的文件或目录。-type f
查找的类型为文件。-print
输出查找的文件目录名。-exec rm -rf {} ;
执行删除指令。
5. 删除指定目录下的 .svn
目录
要删除指定目录下所有的 .svn
目录,可以使用以下命令:
1 | find 要查找的目录名 -name .svn | xargs rm -rf |
或者:
1 | find -type d | grep '.svn$' | xargs rm -r |
这个命令通过 grep
查找包含 .svn
的目录,然后使用 xargs
传递给 rm -rf
命令进行删除。
6. 使用正则表达式
在处理文件时,经常需要使用正则表达式来精确匹配文件名。egrep
是 grep
的一个扩展版本,它支持正则表达式元字符,如 +
, ?
, |
, ()
等。
例如,要删除当前目录下所有包含 “test” 或 “fff” 或 “ppp” 的 .txt
文件,可以使用以下命令:
1 | rm `find . -name '*.txt' | egrep -v '(test.txt|fff.txt|ppp.txt)'` |
7. 注意事项
在使用 rm
和 find
命令时要格外小心,因为这些操作是不可逆的。在执行删除操作之前,请确保有足够的备份,并且已经确认了正确的文件和目录。
find 命令使用说明
用法
find path -option [ -print ] [ -exec -ok command ] {} \;
使用说明
将档案系统内符合 expression 的档案列出来。你可以指定档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find 根据下列规则判断 path 和 expression,在命令列上第一个 -
、(
、)
、!
之前的部份为 path,之后的是 expression。如果 path 是空字串则使用当前路径,如果 expression 是空字串则使用 -print
为默认 expression。
expression 中可使用的选项有二三十个之多,在此只介绍最常用的部分。
-mount
,-xdev
: 只检查和指定目录在同一个档案系统下的档案,避免列出其他档案系统中的档案-amin n
: 在过去 n 分钟内被读取过-anewer file
: 比档案 file 更晚被读取过的档案-atime n
: 在过去 n 天过读取过的档案-cmin n
: 在过去 n 分钟内被修改过-cnewer file
: 比档案 file 更新的档案-ctime n
: 在过去 n 天过修改过的档案-empty
: 空的档案-gid n
或-group name
: gid 是 n 或是 group 名称是 name-ipath p
,-path p
: 路径名称符合 p 的档案,ipath 会忽略大小写-name name
,-iname name
: 档案名称符合 name 的档案。iname 会忽略大小写-size n
: 档案大小是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。-type c
: 档案类型是 c 的档案。d
: 目录c
: 字型装置档案b
: 区块装置档案p
: 具名贮列f
: 一般档案l
: 符号连结s
: socket
-pid n
: process id 是 n 的档案
你可以使用()
将运算式分隔,并使用下列运算。exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2
范例
将当前目录及其子目录下所有扩展名是 .c
的档案列出来。
1 | find . -name "*.c" |
将当前目录及其子目录中所有一般档案列出。
1 | find . -type f |
将当前目录及其子目录下所有最近 20 分钟内更新过的档案列出。
1 | find . -ctime -20 |
查找当前目录及其子目录下所有文件中包含字符串 xxx
的文件,并分页显示。
1 | find . -name "*" -exec grep 'xxx' {} \; -print | more |
注意:在最后一个例子中,我修复了命令中的错误,将 xxx
替换为 'xxx'
,并在 grep
命令后面添加了反斜杠 \
来转义分号。
${} 默认值
1 |
|
执行
1 | ./shell文件名.sh 读取的文件 |