linux文件和目录管理常用命令

linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。linux命令几乎成为用户使用linux的入口,会使用常用命令成为了学习和使用linux的基础。

cd 目录命令 cd [-L|[-P [-e]] [-@]] [dir]

cd /home 进入 ‘/home’ 目录
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入当前用户的主目录
cd ~ 进入当前用户的主目录
cd – 进入当前用户的主目录
cd ~user1 指定进入user1用户的主目录
cd - 返回上次所在的目录

cd命令的作用就是从当前目录跳转到dir处, 如果dir处留空的话就会跳转到环境变量HOME中设置的值.

环境变量CDPATH
对于环境变量CDPATH,如果没有设置CDPATH的话,每次cd查找的跳转目录都是以当前的目录为父目录.
若有设置CDPATH的话,每次cd查找的跳转目录就是以设置的目录为父目录来查找.
e.g. 假设当前有目录结构: ~/a/b/c 若没有设置CDPATH

1
2
3
[root@centos1 ~]# cd a
[root@centos1 a]# cd c
-bash: cd: c: No such file or directory

若将CDPATH设为CDPATH=.:/root/a/b的话

1
2
3
[root@centos1 a]# export CDPATH=.:/root/a/b
[root@centos1 a]# cd c
/root/a/b/c

将常用目录设置到CDPATH里就能有效提高cd的效率
CDPATH中目录之间使用:隔开
若不加上.路径(即当前路径的话),以前默认的本目录作为父目录cd就不可用了
若dir处是以/开头(即是绝对路径)的话,CDPATH就失效了

cd -P, -e参数
进入到快捷方式目录的实际目录中. e.g. 假设 ~ 目录下有a,b两个目录, 同时a下有一个连接到b的子目录b(这个b是快捷方式)

1
2
3
4
[root@centos1 a]# cd b
/root/a/b
[root@centos1 a]# cd -P b
./b

若将一个文件夹自己的快捷方式放到文件夹里,这样写脚本的时候就有可能会出现无限循环,当前路径名就会变得无限长,但是加上了-P命令后就可以避免无线循环的情况.
如果在-P后面加上-e的话,若跳转前路径不存在对应物理路径的话(比如说夹杂着多个快捷方式为名称的路径)就会返回一个失败的状态.

cd -L参数
-L参数和-P相反(两者不能同时出现,即 -L|-P),是跳转到链接目录中,类似于不带参数的cd.

1
2
[root@centos1 a]# cd -L b
/root/a/b

pwd 显示工作路径 pwd [-LP]

1
2
[root@centos1 c]# pwd
/root/a/b/c

pwd -L参数
L(logical)当目录为连接路径时,显示连接路径
pwd -P参数
P(physical)显示实际物理路径,而非使用连接(link)路径

1
2
3
4
5
6
[root@centos1 java_sdk_1.8.0]# pwd
/etc/alternatives/java_sdk_1.8.0
[root@centos1 java_sdk_1.8.0]# pwd -L
/etc/alternatives/java_sdk_1.8.0
[root@centos1 java_sdk_1.8.0]# pwd -P
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-1.b14.el7_2.x86_64

ls命令 ls [OPTION]... [FILE]...

ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls [0-9] 显示包含数字的文件名和目录名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@centos1 ~]# pwd
/root
[root@centos1 ~]#
[root@centos1 ~]#
[root@centos1 ~]#
[root@centos1 ~]# ls
a anaconda-ks.cfg test
[root@centos1 ~]# ls -F
a/ anaconda-ks.cfg test/
[root@centos1 ~]# ls -f
. .. .pm2
test .bashrc .vimrc
.npm .ssh a
[root@centos1 ~]# ls -a
. .npm .pm2
.. a .bashrc
test .ssh .vimrc

tree命令

显示文件和目录由根目录开始的树形结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
usage: tree [-acdfghilnpqrstuvxACDFQNSUX] [-H baseHREF] [-T title ] [-L level [-R]]
[-P pattern] [-I pattern] [-o filename] [--version] [--help] [--inodes]
[--device] [--noreport] [--nolinks] [--dirsfirst] [--charset charset]
[--filelimit[=]#] [--si] [--timefmt[=]<f>] [<directory list>]

[root@centos1 ~]# tree
.
├── a
│   └── b
│   └── c
├── anaconda-ks.cfg
└── test
└── aaa.txt

4 directories, 2 files

mkdir 创建目录命令 mkdir [OPTION]... DIRECTORY...

mkdir dir1 创建一个叫做dir1的目录
mkdir dir1 dir2 同时创建两个目录
mkdir -p /tmp/dir1/dir2 创建一个目录树

1
Try 'mkdir --help' for more information.

rm 移除命令 rm [OPTION]... FILE...

rm -f file1 删除一个叫做file1的文件
rmdir dir1 删除一个叫做dir1的目录
rm -rf dir1 删除一个叫做dir1的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容

1
Try 'rm --help' for more information.

mv 移动命令

mv dir1 new_dir 重命名/移动 一个目录

1
2
3
4
Usage: mv [OPTION]... [-T] SOURCE DEST
or: mv [OPTION]... SOURCE... DIRECTORY
or: mv [OPTION]... -t DIRECTORY SOURCE...
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.

cp 拷贝命令

cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的所有文件到当前工作目录
cp -a /tmp/dir1 . 复制一个目录到当前工作目录
cp -a dir1 dir2 复制一个目录

1
2
3
4
Usage: cp [OPTION]... [-T] SOURCE DEST
or: cp [OPTION]... SOURCE... DIRECTORY
or: cp [OPTION]... -t DIRECTORY SOURCE...
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

ln 链接命令

ln -s file1 lnk1 创建一个指向文件或目录的软链接
ln file1 lnk1 创建一个指向文件或目录的物理链接

touch 命令 touch [OPTION]... FILE...

修改文件时间戳,或者新建一个不存在的文件
-a 或–time=atime或–time=access或–time=use  只更改存取时间
-c 或–no-create  不建立任何文档
-d 使用指定的日期时间,而非现在的时间
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题
-m 或–time=mtime或–time=modify  只更改变动时间
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同
-t 使用指定的日期时间,而非现在的时间
eg: touch -t 0712250000 file1

file 命令

该命令用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。

1
2
3
4
5
6
7
8
9
10
11
12
[root@centos1 a]# file aaa.txt
aaa.txt: UTF-8 Unicode text
[root@centos1 a]# file -i aaa.txt
aaa.txt: text/plain; charset=utf-8
[root@centos1 a]# file -i hello.html
hello.html: text/html; charset=us-ascii
//查看软连接对应文件的文件类型
[root@centos1 a]# ln -s aaa.txt saaa
[root@centos1 a]# file saaa
saaa: symbolic link to `aaa.txt'
[root@centos1 a]# file -L saaa
saaa: UTF-8 Unicode text

iconv 命令

用来转换文件的编码方式,比如它可以将UTF8编码的转换成GB18030的编码,反过来也行。
-f encoding :把字符从encoding编码开始转换。
-t encoding :把字符转换到encoding编码。
-l :列出已知的编码字符集合
-o file :指定输出文件
-c :忽略输出的非法字符
-s :禁止警告信息,但不是错误信息
–verbose :显示进度信息
-f和-t所能指定的合法字符在-l选项的命令里面都列出来了
iconv -l 列出已知的编码

1
2
3
4
5
[root@centos1 a]# file hello.html
hello.html: HTML document, ISO-8859 text
[root@centos1 a]# iconv -f ISO-8859-1 -t UTF-8 hello.html -o hello2.html
[root@centos1 a]# file hello2.html
hello2.html: HTML document, UTF-8 Unicode text

find 命令 find pathname -options [-print -exec -ok ...]

1
2
3
4
5
6
7
8
9
10
11
12
#查找当前目录下文件内容中含有 html 单词的内容
[root@centos1 a]# find . -type f | xargs grep html
./hello.html:<!DOCTYPE html>
./hello.html:<html>
./hello.html:<meta http-equiv="Content-Type" content="text/html; charset="utf-8" />
./hello.html:</html>
./convert1.html:<html>
./convert1.html:</html>
./hello2.html:<!DOCTYPE html>
./hello2.html:<html>
./hello2.html:<meta http-equiv="Content-Type" content="text/html; charset="utf-8" />
./hello2.html:</html>

find 命令功能强大,使用多变,附上一个连接,讲的非常好。find命令查找包含指定内容的文件

cat 命令 cat [OPTION]... [FILE]...

-n或-number:有1开始对所有输出的行数编号;
-b或–number-nonblank:和-n相似,只不过对于空白行不编号;
-s或–squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行;
-A:显示不可打印字符,行尾显示“$”;
-e:等价于”-vE”选项;
-t:等价于”-vT”选项;

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
28
29
30
31
32
33
34
35
36
37
38
39
40
[root@centos1 a]# touch f1 f2
[root@centos1 a]# echo "hello" > f1
[root@centos1 a]# echo "world" > f2
[root@centos1 a]# cat f1
hello
[root@centos1 a]# cat f1 f2 #同时显示文件fl和f2的内容
hello
world
[root@centos1 a]# cat f1 f2 > f3 #将文件fl和f2合并后放入文件f3中
[root@centos1 a]# cat f3
hello
world

一行命令实现代码行数统计
1. 基本版
# find . -name "*.cpp"|xargs wc -l|grep "total"|awk '{print $1}'
# find . -name "*.cpp"|xargs cat|wc -l
2. 去空行版
# find . -name "*.java"|xargs cat|grep -v ^$|wc -l
上面的^$是正则表达式,^是以匹配开头,$是匹配结尾,所以^$是匹配一个空行。
3. 去注释版
# find . -name "*.java"|xargs cat|grep -v -e ^$ -e ^\s*\/\/.*$|wc -l
上面的^\s*\/\/.*$是正则表达式,其中^\s*表明以空格(多个)开头,\/\/表明是//开头的注释,“.*$”表明可能以“.”结尾
去注释版只是去掉以//开头的注释,对于以/* */包含的注释并没有去掉。
上面是只识别.cpp文件,如果想一次统计多种类型的文件,怎么办呢:
4. 统计本文件夹下.h,.cpp,.sh三种类型的文件代码行数
方式一:
# find -name "*[.h|.cpp|.sh]" -type f | xargs cat | wc -l
方式二:
# find -name "*[.h|.cpp|.sh]" -type f -exec cat {} \; | wc -l
方式三:
# find -regex ".*\.h\|.*\.cpp\|.*\.sh" | xargs cat |wc -l
其实上面三种方法的区别就是find到所有的目标文件的方法,还有下面两种方法可以找到想要的结果。
方法四:
# find -name "*[.h|.cpp|.sh]" ! -name "."
上面!号前半部分找出会包含"."这个目录,用"!"排除这个目录,当然了,这个和上面方式一,二中的-type f是相近似的方法,-type f是指定目标类型为文件。
方法五:最笨的方法:
# find -name "*.h" -o -name "*.sh" -o -name "*.cpp"
此外,如果当前目录下包含子目录,则一并会被find出来,如果不想find子目录,则可以用-maxdepth选项:
# find -maxdepth 1 -name "*[.h|.cpp|.sh]" -type f

0%