Linux统计文件夹下的文件数目

Linux下有三个命令:lsgrepwc。通过这三个命令的组合可以统计目录下文件及文件夹的个数。

#统计当前目录下文件的个数(不包括目录)
ls -l | grep "^-" | wc -l
#统计当前目录下文件的个数(包括子目录)
ls -lR| grep "^-" | wc -l
#查看某目录下文件夹(目录)的个数(包括子目录)
ls -lR | grep "^d" | wc -l

命令解析:

ls -l
长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录,ls -lR是列出所有文件,包括子目录。

grep “^-“
过滤ls的输出信息,只保留一般文件,只保留目录是grep "^d"
命令编辑及光标移动

wc -l
用来计算行数,也可以用来计算文件内容行数,本质是查看文件的newline数量,而echo -n则可以在行尾不输出newline符号,实际统计行数时需注意。

 

快捷修正命令

接下来使用光标二字代替光标的位置。

删除从开头到光标处的命令文本

ctrl + u,例如:

cd /proc/tty;ls -al光标

复制代码如果此时使用ctrl + u快捷键,那么该条命令都会被清除,而不需要长按backspace键。

删除从光标到结尾处的命令文本

ctrl+k,例如:

cd /proc/tty光标;ls -al

复制代码如果此时使用ctrl + k快捷键,那么从光标开始处到结尾的命令文本将会被删除。

还有其他的操作,不再举例,例如:

ctrl + a:光标移动到命令开头
ctrl + e:光标移动到命令结尾
alt f:光标向前移动一个单词
alt b:光标向后移动一个单词
ctrl w:删除一个词(以空格隔开的字符串)

 

linux中删除特殊名称文件的方式

说明一下linux中文件命名规则。文件或目录名由除“/”和空字符“\0”之外的任意ASCII字符序列组成。当然很多操作系统允许更多类型的字符组成文件名。

但对于我们来说,从来不建议使用一些特殊字符来命名文件。不幸的是,我们可能无意中创建了一些特殊名称的文件,或者由程序意外的创建了一些由特殊字符组成的文件。

假设有一个名为-static文件,我们使用普通方式将它删除:

rm -static
rm: invalid option — 's'
Try ‘rm ./-static’ to remove the file '-static'.
Try ‘rm –help’ for more information.

这种方式提示出错,并不能成功地删除-static文件。这是为什么?

我们知道在linux中,通常以-开头,后面跟一些字符,作为一个命令的选项,而不巧的,-static就被rm命令认为是一个参数选项,更不幸的是,实际上并没有该选项,因此最终提示invalid option — ‘s’,导致-static文件无法删除。

rm ./-static

最终发现,我们将-static文件成功删除了。因此可以删除文件时带上路径。

 

清空文件内容

比如有一个大文件,你想快速删除,或者不想删除,但是想清空内容:

>filename

 

添加环境变量

例如怎样把/usr/local/mysql/bin添加为系统变量

vim /etc/profile在最后添加

export PATH=/usr/local/mysql/bin:$PATH

要让刚才的修改马上生效,需要执行

source /etc/profile

 

计算程序运行时间

我们可能会进程写一些小程序,并且想要知道它的运行时间,实际上我们可以很好的利用time命令帮我们计算,例如:

time ./fibo 30
the 30 result is 832040

real 0m0.088s
user 0m0.084s
sys 0m0.004s

 

查看内存占用前10的进程

ps -aux|sort -k4nr |head -n 10

k4代表根据第4列排序,n代表根据数值大小排序,r代表逆序。

 

搜索包含某个字符串的文件

例如,要在当前目录下查找包含test字符串的文件:

grep -rn "test"
test2.txt:1:test

它便可以找到该字符串在哪个文件的第几行。

 

屏幕冻结

程序运行时,终端可能输出大量的日志,你想简单查看一下,又不想记录日志文件,此时可以使用ctrl+s键,冻结屏幕,使得日志不再继续输出,而如果想要恢复,可使用ctrl+q退出冻结。

 

无编辑器情况下编辑文本文件

如果在某些系统上连基本的vi编辑器都没有,那么可以使用下面的方式进行编辑内容:

cat >file.txt

编辑完成后,ctrl+d即可保存。

需要注意的是,只能写,不能读。

 

运行具有时间限制(Timeout)的命令

timeout 是指运行指定的命令,如果在指定时间后仍在运行,则杀死该进程。用来控制程序运行的时间。

要在5秒钟后使ping命令自动终止,你可以运行以下命令。

timeout 5s ping google.com

默认单位为秒,因此5后面不必一定加s。

其他后缀包括:m 代表分钟,h 代表小时,d 代表天

 

Linux查看进程运行的完整路径方法

通过pstop命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等。这时,我们需要通过以下的方法来查看进程的详细信息:

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过llls –l命令即可查看。

ll /proc/PID

cwd符号链接的是进程运行目录;

exe符号连接就是执行程序的绝对路径;

cmdline就是程序运行时输入的命令行命令;

environ记录了进程运行时的环境变量;

fd目录下是进程打开或使用的文件的符号连接。

 

/lib和/usr/lib和/usr/local/lib的区别

简单说,/lib是内核级的,/usr/lib是系统级的,/usr/local/lib是用户级的.

/lib/ — 包含许多被 /bin/  /sbin/ 中的程序使用的库文件。目录 /usr/lib/ 中含有更多用于用户程序的库文件。/lib目录下放置的是/bin/sbin目录下程序所需的库文件。/lib目录下的文件的名称遵循下面的格式:

libc.so.* 
ld* 

仅仅被/usr目录下的程序所使用的共享库不必放到/lib目录下。只有/bin/sbin下的程序所需要的库有必要放到/lib目录下。实际上,libm.so.*类型的库文件如果被是/bin/sbin所需要的,也可以放到/usr/lib下。

/bin/ — 用来贮存用户命令。目录 /usr/bin 也被用来贮存用户命令。

/sbin/ — 许多系统命令(例如 shutdown)的贮存位置。目录 /usr/sbin 中也包括了许多系统命令。

usr 很多人都认为是user缩写,其实不然,是unix system resource缩写。

 

/bin/false 和 /usr/sbin/nologin 区别分析

/usr/sbin/nologin/bin/false的意思是禁止某个用户登录
比较常用的用法:

#添加一个不能登录的用户
useradd -d /usr/local/apache -g apache -s /bin/false apache

要拒绝系统用户登录,可以将其shell设置为/usr/sbin/nologin或者/bin/false

usermod -s | –shell /usr/sbin/nologin username
# 或者
usermod -s | -shell /bin/false username

说明及比较:

/bin/false:/bin/false什么也不做只是返回一个错误状态,然后立即退出。将用户的shell设置为/bin/false,用户会无法登录,并且不会有任何提示。

/usr/sbin/nologin:nologin会礼貌的向用户显示一条信息,并拒绝用户登录:This account is currently not available.

有一些软件,比如一些ftp服务器软件,对于本地非虚拟账户,只有用户有有效的shell才能使用ftp服务。这时候就可以使用nologin使用户即不能登录系统,还能使用一些系统服务,比如ftp服务。/bin/false则不行,这是二者的重要区别之一。

/etc/nologin:如果存在/etc/nologin文件,则系统只允许root用户登录,其他用户全部被拒绝登录,并向他们显示/etc/nologin文件的内容。

 

给history命令添加时间

通常直接执行history是不显示时间的,但是有时为了分析之前命令是在什么时候执行的就不太方便。

编辑/etc/profile 文件,再文件最后末尾加上下面代码

export HISTTIMEFORMAT=" %Y-%m-%d %H:%M:%S  "

保存后执行 source  /etc/profile

也可以使用history | grep 来过滤过不想需要看到的命令,比如说我们要看2019年5月4号都执行了哪些操作,使用 history | grep ‘2019-05-4’

结合lasthistory命令就可以看到某个具体的ip地址对服务器执行了哪些操作。

 

退出当前 Bash Shell 并不保存历史的 5 种方法

某些时候我们希望在退出 Bash Shell 的时候不要保存执行命令的历史记录,那么可以用以下几种方法来实现:

先说两个不影响以前的历史记录的方法:

1. 修改 HISTFILE 变量

unset HISTFILE && exit

2. 直接 Kill 当前 Shell

kill -9 $$

下面三个方法会清除所有的记录:

3. 清除历史记录并退出

history -c && exit

4.设置历史记录保存数量为 0 条并退出

HISTSIZE=0 && exit

5. 删除历史记录文件并修改 HISTFILE 变量

rm -f $HISTFILE && unset HISTFILE && exit

如果你想每次都自动执行这些命令,可以在将对应的指令添加到 ~/.bash_logout 文件中,或者使用 alisa 功能。

 

清除 SSH 登录记录

SSH 登录日志以二进制方式存储在下面文件内,需要使用对应命令查看,不然会显示乱码。

日志文件               查看命令              日志内容
/var/log/wtmp     last                       登录成功日志,包含用户名、IP 地址和时间记录
/var/log/btmp      lastb                    登录失败日志,包含信息同上
/var/log/lastlog    lastlog                 各用户的最近登录日志
/var/log/secure    用cat查看            各类需要输入口令的登录日志

清除 SSH 登录日志使用下面命令。

cat /dev/null > /var/log/wtmp
cat /dev/null > /var/log/btmp
cat /dev/null > /var/log/lastlog
cat /dev/null > /var/log/secure

 

清除 Bash 历史命令

Bash 执行过的命令存在用户目录下的 .bash_history 文件里,用 history 命令查看。

history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2。

历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。

清除所有历史命令记录,并立即更新日志文件。

history -c && history -w

如果只需清除当前会话用过的命令记录,用 history -r 命令清除(因为当前命令记录还在缓冲区中,-r 从文件中覆盖当前的缓冲区,此时history显示的就是此前的历史记录了)。


本文部分转载自zgao’s blog,稍作修改,不定时更新。

 


要留心,

即使当你独自一人时,

也不要说坏话或做坏事,

而要学的在你自己面前比在别人面前更知耻。

——德谟克利特