欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-07 22:31:31
...

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

cd 目录命令 cd [-L|[-P [-e]] [[email protected]]] [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

[[email protected] ~]# cd a
[[email protected] a]# cd c
-bash: cd: c: No such file or directory

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

[[email protected] a]# export CDPATH=.:/root/a/b
[[email protected] a]# cd c
/root/a/b/c

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

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

[[email protected] a]# cd b
/root/a/b
[[email protected] a]# cd -P b
./b

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

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

[[email protected] a]# cd -L b
/root/a/b

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

[[email protected] c]# pwd
/root/a/b/c

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

[[email protected] java_sdk_1.8.0]# pwd
/etc/alternatives/java_sdk_1.8.0
[[email protected] java_sdk_1.8.0]# pwd -L
/etc/alternatives/java_sdk_1.8.0
[[email protected] 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] 显示包含数字的文件名和目录名

[[email protected] ~]# pwd
/root
[[email protected] ~]#
[[email protected] ~]#
[[email protected] ~]#
[[email protected] ~]# ls
a  anaconda-ks.cfg  test
[[email protected] ~]# ls -F
a/  anaconda-ks.cfg  test/
[[email protected] ~]# ls -f
.              ..             .pm2
test           .bashrc        .vimrc
.npm           .ssh           a
[[email protected] ~]# ls -a
.              .npm          .pm2
..             a             .bashrc
test           .ssh          .vimrc

tree命令

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

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>]

[[email protected] ~]# 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 创建一个目录树

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 同时删除两个目录及它们的内容

Try 'rm --help' for more information.

mv 移动命令

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

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 复制一个目录

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通过扩展名来确定文件类型的。

[[email protected] a]# file aaa.txt
aaa.txt: UTF-8 Unicode text
[[email protected] a]# file -i aaa.txt
aaa.txt: text/plain; charset=utf-8
[[email protected] a]# file -i hello.html
hello.html: text/html; charset=us-ascii
//查看软连接对应文件的文件类型
[[email protected] a]# ln -s aaa.txt saaa
[[email protected] a]# file saaa
saaa: symbolic link to `aaa.txt'
[[email protected] 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 列出已知的编码

[[email protected] a]# file hello.html
hello.html: HTML document, ISO-8859 text
[[email protected] a]# iconv -f ISO-8859-1 -t UTF-8 hello.html -o hello2.html
[[email protected] a]# file hello2.html
hello2.html: HTML document, UTF-8 Unicode text

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

#查找当前目录下文件内容中含有 html 单词的内容
[[email protected] 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"选项;

[[email protected] a]# touch f1 f2
[[email protected] a]# echo "hello" > f1
[[email protected] a]# echo "world" > f2
[[email protected] a]# cat f1
hello
[[email protected] a]# cat f1 f2 #同时显示文件fl和f2的内容
hello
world
[[email protected] a]# cat f1 f2 > f3 #将文件fl和f2合并后放入文件f3中
[[email protected] 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