Shell脚本入门:Linux文件管理系统秘籍

通过端口号获取对应的 PID

1
/usr/sbin/lsof -n -P -t -i :$TOMCAT_WEB_PORT

根据名称获取 PID

1
2
3
4
ps -ef | grep -w java |  grep -v grep | awk '{print $2}'

-w 全匹配名字
-v 忽略名字

tar

1
2
3
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName

shell 执行多个命令

  1. 每个命令之间用 ; 隔开
    说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,
    但不保证每个命令都执行成功。

  2. 每个命令之间用 && 隔开
    说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。

  3. 每个命令之间用 || 隔开
    说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功
    一条命令为止

查看历史命令

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 命令可以用来查找文件或目录。结合其他命令如 grepawk,你可以进一步筛选出需要删除的文件。

例如,要删除当前目录下所有 .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 文件,可以使用 findgrep

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. 使用正则表达式

在处理文件时,经常需要使用正则表达式来精确匹配文件名。egrepgrep 的一个扩展版本,它支持正则表达式元字符,如 +, ?, |, () 等。

例如,要删除当前目录下所有包含 “test” 或 “fff” 或 “ppp” 的 .txt 文件,可以使用以下命令:

1
rm `find . -name '*.txt' | egrep -v '(test.txt|fff.txt|ppp.txt)'`

7. 注意事项

在使用 rmfind 命令时要格外小心,因为这些操作是不可逆的。在执行删除操作之前,请确保有足够的备份,并且已经确认了正确的文件和目录。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
# 脚本名称
SCRIPT=$(basename$0)

# 使用函数检查参数
function usage() {
echo -e "\nUSAGE: $SCRIPT file\n"
exit 1
}

# 检查是否提供了文件名
if [ -z "$1" ]; then
usage
fi

# 检查文件是否存在
FILENAME="$1"
if [ ! -f "$FILENAME" ]; then
echo "Error: File '$FILENAME' does not exist."
usage
fi

# 逐行读取文件并执行 wget
while read -r LINE; do
wget "$LINE"
done < "$FILENAME"

执行

1
./shell文件名.sh 读取的文件