# find 命令 rm 删除某目录下所有子目录中的某类文件
find . -name "test.file" -exec rm -rf {} \;
# or
find . -name "test.file" | xargs rm -rf;
# tree 命令输出文件夹目录结构
# 安装
brew install tree
# 帮助
tree --help
# 案例:输出当前目录的2层结构,忽略 node_modules,根据命名排序且文件夹优先输出
tree -L 2 -I node_modules --sort=name --dirsfirst
# 统计文件夹下的文件数目
Linux 下有三个命令:ls
, grep
, wc
,通过这三个命令的组合可以统计目录下文件及文件夹的个数:
# 统计当前目录下文件的个数(不包括目录)
$ ls -l | grep "^-" | wc -l
# 统计当前目录下文件夹的个数(不包括文件)
$ ls -l | grep "^d" | wc -l
# 统计当前目录下文件的个数(包括子目录)
$ ls -lR| grep "^-" | wc -l
命令解析:
ls -l
: 长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录,ls -lR
是列出所有文件,包括子目录grep "^-"
: 过滤ls
的输出信息,只保留一般文件,只保留目录是grep "^d"
wc -l
: 统计输出信息的行数,统计结果就是输出信息的行数,一行信息对应一个文件,所以就是文件的个数
# 解决 Mac XAMPP Mysql 无法启动问题
ps -ef | grep mysqld # 得到相应进程 PID
sudo kill PID
sudo /Applications/XAMPP/xamppfiles/bin/mysql.server start
# 复制到剪贴板
pbcopy < ~/.ssh/id_rsa.pub
# 根据端口杀死进程 shell 脚本
# 查看指定端口号所使用的进程号
lsof -i:8080
# 列出所有端口
netstat -ntlp
# 杀死指定端口进程
kill -9 $pid
# 创建和删除软、硬链接
# 硬链接
ln src dist
# 软链接
ln -s src dist
# 删除链接,注意不是rm -rf symbolic_name/
rm -rf symbolic_name
linux 软连接和硬链接的区别:
软连接可以跨文件系统,硬连接不可以。
实践的方法就是用共享文件把 windows 下的 aa.txt 文本文档连接到 linux 下 /root 目录 下 bb,cc . ln -s aa.txt /root/bb 连接成功 。ln aa.txt /root/bb 失败 。
关于 I 节点的问题 。硬连接不管有多少个,都指向的是同一个 I 节点,会把结点连接数增加 ,只要结点的连接数不是 0,文件就一直存在 ,不管你删除的是源文件还是连接的文件。只要有一个存在 ,文件就存在(其实也不分什么源文件连接文件的,因为他们指向都是同一个 I 节点)。
当你修改源文件或者连接文件任何一个的时候 ,其他的文件都会做同步的修改。软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以删除连接文件对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.
软连接可以对一个不存在的文件名进行连接。
软连接可以对目录进行连接。
备注:I 节点:它是 UNIX 内部用于描述文件特性的数据结构。我们通常称 I 节点为文件索引结点(信息结点)。I 节点含有关于文件的大部分的重要信息,包括文件数据块在磁盘上的地址。每一个I节点有它自己的标志号,我们称为文件顺序号。I 节点包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间截。
# 统计当前文件夹下的文件/目录个数
- 统计当前文件夹下文件的个数:
ls -l | grep "^-" | wc -l
- 统计当前文件夹下目录的个数:
ls -l | grep "^d" | wc -l
- 统计当前文件夹&子文件夹下文件的个数:
ls -l | grep "^-" | wc -l
- 统计当前文件夹&子文件夹下目录的个数:
ls -l | grep "^d" | wc -l
# Linux 下查看文件和文件夹大小的 df 和 du 命令
df
可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力du
可以查看文件及文件夹的大小
两者配合使用,非常有效。比如用 df 查看哪个一级目录过大,然后用 du 查看文件夹或文件的大小,如此便可迅速确定症结
df 命令可以显示目前所有文件系统的可用空间及使用情形,栗子:
[jimco@jimco-pro ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 3.9G 300M 3.4G 8% /
/dev/sda7 100G 188M 95G 1% /data0
/dev/sdb1 133G 80G 47G 64% /data1
/dev/sda6 7.8G 218M 7.2G 3% /var
/dev/sda5 7.8G 166M 7.2G 3% /tmp
/dev/sda3 9.7G 2.5G 6.8G 27% /usr
tmpfs 2.0G 0 2.0G 0% /dev/shm
参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式
上面的命令输出的第一个字段(Filesystem)及最后一个字段(Mounted on)分别是档案系统及其挂入点。我们可以看到 /dev/sda1 这个分割区被挂在根目录下
接下来的四个字段 Size、Used、Avail、及 Use% 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。 FreeBSD下,当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理
__ du:查询文件或文件夹的磁盘使用空间__
如果当前目录下文件和文件夹很多,使用不带参数 du 的命令,可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的,所以得指定 深入目录的层数,参数:--max-depth=,这是个极为有用的参数。如下,注意使用 '*',可以得到文件的使用空间大小:
__注意:__一向命令比 linux 复杂的 FreeBSD,它的 du 命令指定深入目录的层数却是比 linux 简化,为 -d
[jimco@jimco-pro ~]# du -h --max-depth=1 work/testing
27M work/testing/logs
35M work/testing
[jimco@jimco-pro ~]# du -h --max-depth=1 work/testing/*
8.0K work/testing/func.php
27M work/testing/logs
8.1M work/testing/nohup.out
8.0K work/testing/testing_c.php
12K work/testing/testing_func_reg.php
8.0K work/testing/testing_get.php
8.0K work/testing/testing_g.php
8.0K work/testing/var.php
[jimco@jimco-pro ~]# du -h --max-depth=1 work/testing/logs/
27M work/testing/logs/
[jimco@jimco-pro ~]# du -h --max-depth=1 work/testing/logs/*
24K work/testing/logs/errdate.log_show.log
8.0K work/testing/logs/pertime_show.log
27M work/testing/logs/show.log
du
统计文件大小相加df
统计数据块使用情况
如果有一个进程在打开一个大文件的时候,这个大文件直接被 rm 或者 mv 掉,则 du 会更新统计数值,df 不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被 kill 掉
# Centos6.x 安装 Git
安装编译git时需要的包
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel $ yum install gcc perl-ExtUtils-MakeMaker
删除已有的 git
$ yum remove git
下载 git 源码
$ cd ~ $ wget https://www.kernel.org/pub/software/scm/git/git-2.9.3.tar.gz $ tar xzf git-2.9.3.tar.gz
编译安装
$ cd git-2.9.3 $ make prefix=/usr/local/git all $ make prefix=/usr/local/git install $ echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc $ source /etc/bashrc
检查一下版本号
$ git --version
# Centos6.x 安装 Node.js
使用已编译版本安装:
下载安装包:
wget http://nodejs.org/dist/v7.9.0/node-v7.9.0-linux-x64.tar.gz
解压:
tar zxvf node-v7.9.0-linux-x64.tar.gz -C /user/local/node
修改目录名:
cd /user/local/node && sudo mv node-v7.9.0-linux-x64 7.9.0
配置软链接/PATH:
sudo ln -s /usr/local/node/7.9.0/bin/node /usr/local/bin/node sudo ln -s /usr/local/node/7.9.0/bin/npm /usr/local/bin/npm
or
$ vim /etc/profile # 在 'export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL' 这一行的上面添加 export NODE_HOME=/usr/local/node/7.9.0 export PATH=$NODE_HOME/bin:$PATH # wq 保存退出后执行 $ source /etc/profile
**注意:**执行
sudo npm install -g pm2
报错sudo:pm2:找不到命令
是因为 sudo 运行时,会默认重置环境变量为安全的环境变量,也即,当前设置的变量都会失效。sudo -l
查看 sudo 的 secure_path,将要 sudo 执行的命令 symlink 到相应的 secure_path,或者sudo vim /etc/sudoers
修改 secure_path 值即可解决。测试是否安装成功:
node -v
# Linux mail 命令
语法:
mail (选项) (参数)
选项:
-e: 测试系统邮箱内是否有邮件
-b<地址>: 指定密件副本的收信人地址
-c<地址>: 指定副本的收信人地址
-f<邮件文件>: 读取指定邮件文件中的邮件
-i: 不显示终端发出的信息
-I: 使用互动模式
-n: 程序使用时,不使用mail.rc文件中的设置
-N: 阅读邮件时,不显示邮件的标题
-s<邮件主题>: 指定邮件的主题
-u<用户帐号>: 读取指定用户的邮件
-v: 执行时,显示详细的信息
实例:
直接使用shell当编辑器
mail -s "Hello from test.com by shell" admin@test.com hello,this is the content of mail. welcome to www.test.com
第一行是输入的命令,
-s
表示邮件的主题,后面的 admin@test.com 则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,我们可以输入任何文字,比如上面的两行。当邮件正文输入完成后,需要按CTRL+D
结束输入,此时会提示你输入 Cc 地址,即邮件抄送地址,没有直接回车就完成了邮件的发送。使用管道进行邮件发送
echo "hello, this is the content of mail.welcome to www.test.com" | mail -s "Hello from test.com by pipe" admin@test.com
使用管道直接敲入这行命令即可完成邮件的发送,其中echo后的是邮件正文。
使用文件进行邮件发送
mail -s "Hello from test.com by file" admin@test.com < mail.txt
使用上面的命令后,我们就可以把 mail.txt 文件的内容作为邮件的内容发送给 admin@test.com 了。
使用上述三种方式都可以给外部邮箱进行邮件发送,但因为前面 2 中都是直接在 shell 中敲入邮件内容,因此无法输入中文,即使我们使用粘贴的方式输入了中文,那么收到的邮件也是乱码的。但第 3 种方式,我们可以在 window 下编辑好邮件内容后,放到 linux 下,再进行发送,这样就可以正常发送中文了。不过目前邮件的中文标题暂时没有找到解决办法。
传送电子邮件给本系统用户
语法:
mail {用户名}
将信件送给一个或以上的电子邮件地址
mail user1@email.address user2
由于没有加入其他的选项,使用者必须输入标题与信件的内容等。而 user2 没有主机位置,就会送给邮件服务器的 user2 使用者。
mail -s 标题 -c user1 user2 < mail.txt
将 mail.txt 的内容寄给 user2 同时 cc 给 user1 。如果将这一行指令设成 cronjob 就可以定时将备忘录寄给系统使用者。
检查所传送的电子邮件是否送出,或滞留在邮件服务器中
/usr/lib/sendmail -bp
若屏幕显示为 "Mail queue is empty" 的信息,表示 mail 已送出;若为其他错误信息,表示电子邮件因故尚未送出。
很多情况下,我们也需要使用邮件来发送附件,在 linux 下使用 mail 命令发送附件也很简单,不过首先需要安装 uuencode 软件包,这个程序是对二进制文件进行编码使其适合通过邮件进行发送,在 CentOS 上安装该软件包如下:
yum install sharutils
安装完成后我们就可以来进行附件的发送了,使用如下命令:
uuencode test.txt test | mail -s "hello,see the attachement" admin@test.com
完成后就可以把 text.txt 文件作为邮件的附件发送出去了。uuencode 有两个参数,第一个是要发送的文件,第二个是显示的文件名称。
阅读邮件:
Linux 下 mail 命令收集系统收到邮件都会保存在 "/var/spool/mail/[linux用户名]" 文件中。在 linux 中输入 mail,就进入了收件箱,并显示邮件列表。此时命令提示符为 &
:
& help
如果不会使用或者忘记了什么命令,就输入 help 或者 ? 来获取帮助,还可以输入以下命令对邮件进行相关操作:
? | help: 显示多个查看邮件列表的命令参数用法
l | list: 显示当前支持的命令列表
more | p | page: 阅读当前指针所在的邮件内容 阅读时,按空格键就是翻页,按回车键就是下移一行
t | type | more | p | page {num}: 阅读某一封邮件,多个信息用空格分开,如
& t 1 7
d: 删除当前邮件,指针并下移。
& d 1-100
删除第1到100封邮件f | from: 只显示当前邮件的简易信息。
& f {num}
显示某一个邮件的简易信息n | next | {什么都不填}: 阅读当前指针所在的下一封邮件内容阅读时,按空格键就是翻页,按回车键就是下移一行
z: 显示刚进行收件箱时的后面二十封邮件列表
x: 退出 mail 命令平台,并不保存之前的操作,比如删除邮件
q: 退出mail命令平台
写信时,连按两次 Ctrl+C 键则中断工作,不送此信件。读信时,按一次 Ctrl+C,退出阅读状态。
Linux mail 利用外部邮箱地址发邮件:
bin/mail 会默认使用本地 sendmail 发送邮件,这样要求本地的机器必须安装和启动 Sendmail 服务,配置非常麻烦,而且会带来不必要的资源占用。而通过修改配置文件可以使用外部 SMTP 服务器,可以达到不使用 sendmail 而用外部的 smtp 服务器发送邮件的目的:
# 修改/etc/nail.rc (/etc/mail.rc)
set from=fromUser@domain.com smtp=smtp.domain.comset smtp-auth-user=username smtp-auth-password=passwordset smtp-auth=login
说明:
- from: 发送的邮件地址
- smtp: 发送邮件的外部 smtp 服务器的地址
- smtp-auth-user: 外部 smtp 服务器认证的用户名
- smtp-auth-password: 外部 smtp 服务器认证的用户密码
- smtp-auth: SMTP 的认证方式。默认是 LOGIN,也可改为 CRAM-MD5 或 PLAIN 方式
配置成功后,就可以使用了,发送测试邮件
mail -s "test" user@sohu.com < content.txt
其中 -s 后面的是邮件标题,user@sohu.com 是收件人地址,content.txt 里面是邮件正文
# Centos 新建用户,并配置 root 权限
添加用户
adduser tommy
,添加一个名为tommy的用户;passwd tommy
修改密码赋予 root 权限
**方法1:**修改
/etc/sudoers
文件,找到下面一行,把前面的注释(#)去掉## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
然后修改用户,使其属于root组(wheel),命令如下:
$ usermod -g root tommy
修改完毕,现在可以用 tommy 帐号登录,然后用命令
su -
,即可获得root权限进行操作。**方法2:**修改
/etc/sudoers
文件,找到下面一行,在 root 下面添加一行,如下所示:## Allow root to run any commands anywhere root ALL=(ALL) ALL tommy ALL=(ALL) ALL
修改完毕,现在可以用 tommy 帐号登录,然后用命令
su -
,即可获得root权限进行操作。
# Centos 配置用户 root 权限,同时 SSH 免密码登录
新建用户:
adduser tommy
,添加一个名为 tommy 的用户不允许密码登录
sudo passwd -l tommy
配置 root 权限
修改
/etc/sudoers
文件,找到下面一行,把前面的注释(#)去掉## wheel 用户组免密执行所有 shell 命令 %wheel ALL=(ALL) NOPASSWD: ALL
然后将用户加入 wheel 用户组(root),
usermod -g root tommy
远程机,修改 sshd 的配置文件(需 root 权限)
sudo vim /etc/ssh/sshd_config
开启以下的选项:
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys # PasswordAuthentication no # 此项慎改,如果为 no 将禁止密码方式 SSH 登录
重启 sshd 服务:
sudo service sshd restart
跳板机,生成 SSH 密钥
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
一路回车,可生成本机的 rsa 类型的密钥远程机把公钥写入 authorized_keys 文件
跳板机,
pbcopy < ~/.ssh/id_rsa.pub
复制公钥;远程机将复制的公钥导入到认证文件vim ~/.ssh/authorized_keys
,粘贴。远程机上修改相关访问权限
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
如果登录失败,可能是 .ssh 目录的用户及用户组不属于登录的用户,chown 修改即可
chown -R tommy .ssh
# 查看权限命令
ls -la
权限列表:
输出的第一列描述了文件的权限,以下是对应表:
|:-😐:------------------------😐 | - | it is a regular file | | d | if it is a directory | | c | for a character device | | b | for a block device | | l | if it is a symbolic link | | s | for a socket | | p | for a pipe |
举个栗子,-rw-r--r--
:
第1列为文件描述,"-" 代表[文件];
剩下的每3列为一组,r: 读,w: 写,x: 执行,-: 未设置;
第一组
rw-
对应用户权限;第二组
r--
对应组群权限;第三组
r--
对应其他用户的权限;如果相应组为
---
代表对应的权限没有设置。
-rw------- (600) 只有所有者才有读和写的权限
-rw-r--r-- (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
drwx------ (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx--x--x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw- (666) 每个人都有读写的权限
-rwxrwxrwx (777) 每个人都有读写和执行的权限
读,写,执行权限可以使用数字来代替:
r--: 4
-w-: 2
--x: 1
rw-: 4+2= 6
r-x: 4+1 =5
rwxrw-r--: 764
rwx: 4+2+1=7
设置权限:
chmod u=rwx,g=rw,o=r A.txt
: 设置用户权限 rwx,组权限 rw,其他用户权限 rchmod g+x A.txt
: 为组用户增加执行权限chmod u-x A.txt: 为用户移除执行权限
chmod a-x filename
: 为所有角色移除执行权限chmod 700 file -R
: 为用户递归设置 file 文件夹及文件夹下的所有文件读写执行权限
特殊的目录权限:
目录有一个特殊权限 t/T,如果设置了这个权限,此目录的文件只能被拥有此权限的用户删除,即使组和其他用户写目录的写权限,也不能删除文件
------rwt
, ------rwT
# CentOS 让一个用户没有登录权限
还未建立用户时,可以使用以下命令
useradd -g groupname username -s /bin/false
: -s 为默认 shell,不给 shell,也就不能登录useradd -g groupname username -s /sbin/nologin
: -s 为默认 shell,默认给予 shell,但是不给登录 shell
当用户已经建立了,在建立时没有控制,现在需要取消用户登录权限,可以使用以下命令:
# 切换至 root 用户 su root vim /etc/passwd # 找到你要修改的用户所在的那一行 # eg: username:x:502:502::/home/username:/bin/bash # -> username:x:502:502::/home/username:/sbin/nologin
# CentOS 查看用户登录记录
# 查询 wtmp 文件并报告当前登录的每个用户
who
# 查看所有登陆记录
who /var/log/wtmp
# 往回搜索 wtmp 来显示自从文件第一次创建以来登录过的用户
last
# rsync 命令
rsync -avz $ENV_PROJECT_ROOT/public/ xjc@180.72.10.136:$ENV_RELEASE_PATH
如果有报错 rsync: failed to set times on "xxx",这是因为同步到目标目录的文件用户和组都变成了同步使用的用户,和远程目标目录的用户和组不一致造成,
chown xxx:xxx www` 将目标目录的用户和组修改为和执行 rsync 命令的用户一致即可。
# scp 命令
scp -Cpr $ENV_PROJECT_ROOT/public/* xjc@180.76.190.127:$ENV_RELEASE_PATH
# Linux 下用户,用户组和用户权限的查看
more /etc/passwd
: 用户信息more /etc/shadow
: 用户加密后的口令存放位置more /etc/group
: 用户组信息userdel peter
: 删除 peter 用户帐号groupdel peter
: 删除 peter 用户组usermod –G peter peter
: 强制删除该用户的主目录和主目录下的所有文件和子目录
more /etc/passwd
一行记录对应着一个用户,每行记录又被冒号分隔为7个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
more /etc/group
每个用户组一条记录,包括用户组、用户组口令、GID及该用户组所包含的用户,格式和具体含义如下:
用户组名称:用户组密码:GID:用户列表
# Mac OS 打开原生 NTFS 读写
Mac 本身是支持原生的 NTFS 读写的,只不过这一功能被隐藏了,但是可以手动打开,这比第三方的的工具要安全得多,有时第三方工具可能会发生整个 NTFS 分区数据丢失的情况,下面是打开 MAC 原生 NTFS 读写功能的步骤:
打开终端输入
diskutil list
查看所有分区的卷标输入
sudo vim /etc/fstab
再输入密码回车进入配置根据自己要配置的 NTFS 分区卷标输入配置信息,例如:
LABEL=KINGSTON none ntfs rw,auto,nobrowse
完成后,保存退出
用磁盘工具将配置好的分区进行卸载再装载使配置生效(无需重启)
因为加入了
nobrowse
所以 Finder 中看不到修改过的 NTFS 分区(不加入 nobrowse 不会生效),所以可以使用快捷方式进行访问:在终端中输入sudo ln -s /Volumes/KINGSTON ~/Desktop/KINGSTON
即可在桌面生成 NTFS 分区的快捷方式,或者cmd+shift+G
前往/Volumes
文件夹将快捷方式拖动到 Finder 的侧边栏就可以很方便的打开 NTFS 分区进行操作了
# nvm 常用命令
nvm list
/nvm ls
查看 node 的安装版本nvm install 6.9.0
安装一个 6.9.0 版本的 nodenvm install stable
安装最新稳定版 nodenvm use 6.9.0
当前命令行使用 6.9.0 版本的 nodenvm uninstall 6.9.0
删除 6.9.0 版本的 nodenvm ls-remote
罗列远程的 node 版本nvm current
查看当前正在使用的 node 版本npm list --depth=0 -g
查看全局都安装了那些 npm 的包nvm alias default v4.3.0
切换 v4.3.0 为默认版本,每次新建的命令行中就是默认的版本了
下载速度慢解决办法:
更换下载源,命令行输入:
NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/
建议加入 .bash_profile
文件中:
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/
若终端使用了 oh-my-zsh
,则需手动在 ~/.zshrc
中写入配置:
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
完成后执行 source ~/.zshrc
让配置立即生效。
注意
利用 nvm 切换 node 版本后,~/.npmrc
的配置同样是生效的,注意该配置的覆盖问题,比如:
# ~/.npmrc
registry=https://registry.npmmirror.com/
prefix=/Users/xiejiancong/.nvm/versions/node/v14.17.6
此时,若已切换至 node@16.17.0,npm 仍然会使用 node@14.17.6 版本。