1、文件管理
更新于:2024年3月3日
文件类
目录
[toc]
tree命令
tree命令可以以目录树的形式显示指定(默认显示这个文件系统)目录的所有文件夹和文件。
- 安装:
yum install -y tree
- 使用方法
$ tree folder
案例:tree命令测试
[root@hg-linux-test ~]# tree test
test
├── 1.txt
├── 2.txt
└── test
1 directory, 2 files
[root@hg-linux-test ~]#
案例:解决tree命令显示中文乱码问题 -N
2023年12月16日(已解决)
但是,默认情况下,tree命令无法显示中文文件或文件夹名,会是一串转义字符。这时可以用选项-N来显示中文文件名:
$ tree -N folder
- 测试过程
默认情况下,tree命令无法显示中文文件或文件夹名,会是一串转义字符。
这时可以用选项-N来显示中文文件名:
find命令
查找文件命令
linux find命令使用案例?
find
是Linux中强大且广泛使用的命令,用于在指定目录及其子目录中搜索文件和目录。以下是一些find
命令的使用案例:
-
查找特定文件名:
-
在当前目录及其子目录中查找名为 “filename.txt” 的文件:
find . -name "filename.txt"
-
==在指定目录 (“/path/to/dir”) 及其子目录中查找名为 “filename.txt” 的文件:==
find /path/to/dir -name "filename.txt"
-
-
根据文件类型进行查找:
-
查找所有普通文件(非目录、链接等):
find . -type f
-
查找所有目录:
find . -type d
-
查找所有符号链接文件:
find . -type l
-
-
根据文件大小进行查找:
-
查找大于100MB的文件:
find . -size +100M
-
查找小于1KB的文件:
find . -size -1k
-
-
结合多个条件进行查找:
-
查找名为 “filename.txt” 并且文件大小大于1MB的文件:
find . -name "filename.txt" -size +1M
-
查找以 “.txt” 结尾的文件并且最近7天内修改过的文件:
find . -name "*.txt" -mtime -7
-
-
执行操作:
-
对查找到的文件执行特定的操作,如打印文件名:
find . -type f -exec echo {} \;
-
删除所有以 “.txt” 结尾的文件:
find . -name "*.txt" -delete
-
这些只是find
命令的一些常见用例,实际上它还有更多的选项和功能。您可以通过运行man find
命令来查阅完整的find
命令的文档和更多的示例。
find里可以使用通配符,例如*吗?
是的,find
命令支持使用通配符(如星号 “*”) 进行模式匹配,以便更灵活地搜索文件和目录。下面是几个示例:
-
查找以 “.txt” 结尾的文件:
find . -name "*.txt"
-
查找以 “file” 开头并以 “.csv” 结尾的文件:
find . -name "file*.csv"
-
查找名称中包含 “keyword” 的文件:
find . -name "*keyword*"
需要注意的是,在使用通配符进行模式匹配时,确保通配符被引号括起来,以确保通配符在运行之前被find
命令解释,而不是由shell解释。
另外,find
命令也支持其他模式匹配选项,如?
表示匹配单个字符,[]
表示匹配字符集合等。您可以参考find
命令的文档或使用man find
命令了解更多关于模式匹配的详细信息和示例。
案例:在指定目录查找特定文件名
==在指定目录 (“/path/to/dir”) 及其子目录中查找名为 “filename.txt” 的文件:==
find /path/to/dir -name "filename.txt"
案例:在指定目录查找某类型的文件
查找以 “.txt” 结尾的文件:
find . -name "*.txt"
案例:在指定目录查找某类型的文件(==或功能==)
find里通配符可以使用或吗?
在find
命令中,通配符本身是不能用于表示逻辑 “或” 的,但您可以使用 -o
选项来实现类似的功能。下面是一个示例:
假设您想要查找以 “.txt” 或 “.csv” 结尾的文件,您可以使用 -name
选项和 -o
选项结合起来使用:
find . \( -name "*.txt" -o -name "*.csv" \)
上述命令中,使用圆括号 \(
和 \)
来分组两个条件,然后使用 -o
表示逻辑 “或”。
请注意,在使用 \(
和 \)
进行分组时,需要对它们进行转义,以防止它们被shell解释。同样,通配符也需要用引号括起来,以避免被shell提前展开。
希望这个解释能够帮助到您!如果您还有其他问题,请随时提问。
案例:对如何find命令找出的文件执行特定的操作?
find
命令是Linux和Unix系统中一个非常强大的工具,用于基于各种条件搜索文件系统中的文件。你可以将find
命令的输出与其他命令结合使用,以对找到的文件执行特定的操作。这通常通过使用-exec
选项或将find
命令的输出通过管道传递给xargs
命令来实现。
使用-exec
选项
-exec
选项允许你为find
命令找到的每个文件执行一个命令。命令的语法如下:
find [搜索路径] [选项] -exec [要执行的命令] {} \;
这里,{}
是一个占位符,代表当前找到的文件名;\;
是命令的结束标志。
例如,如果你想要找到当前目录及子目录下所有的.txt
文件,并删除它们,你可以使用:
find . -type f -name "*.txt" -exec rm {} \;
如果你想要为找到的每个文件执行更复杂的命令或多个命令,可以使用sh
或bash
作为-exec
参数。例如,打印每个找到的文件名并删除这些文件:
find . -type f -name "*.txt" -exec sh -c 'echo "Deleting file: {}"; rm {}' \;
使用xargs
命令
另一种方式是使用xargs
命令。xargs
可以从标准输入接收数据,并将这些数据作为参数传递给指定的命令,这使得xargs
与find
命令配合非常有效。
例如,删除当前目录及子目录下所有的.txt
文件:
find . -type f -name "*.txt" | xargs rm
xargs
默认以空格为分隔符将输入分割成多个参数,对于包含空格、引号或其他特殊字符的文件名,可以使用find
命令的-print0
选项和xargs
的-0
选项,以null字符作为记录的终止符,从而安全地处理这些文件名:
find . -type f -name "*.txt" -print0 | xargs -0 rm
使用xargs
执行复杂命令时,可以结合使用sh
或bash
:
find . -type f -name "*.txt" -print0 | xargs -0 -I {} sh -c 'echo "Deleting file: {}"; rm {}'
这里,-I {}
选项指定了一个替换字符串,该字符串在xargs
将要执行的命令中被每个输入项替换。
不管是使用-exec
还是xargs
,都能有效地将find
命令与其他命令结合起来,对找到的文件执行各种操作。选择哪种方法取决于你的具体需求以及你觉得哪种方法更方便。
实际测试案例
find /root/rsync/site -name "*.html"
find /root/rsync/site \( -name "*.html" -o -name "*.png" \)
find /root/rsync/site \( -name "*.html" -o -name "*.png" -o -name "*.md" \)
du命令
显示每个文件和目录的磁盘使用空间
du命令 也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。
语法
du [选项][文件]
选项
1. -a或-all 显示目录中个别文件的大小。
2. -b或-bytes 显示目录或文件大小时 ,以byte为单位。
3. -c或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。(常用)
4. -k或--kilobytes 以KB(1024bytes)为单位输出。 (常用)
5. -m或--megabytes 以MB为单位输出。
6. -s或--summarize 仅显示总计,只列出最后加总的值。(常用)
7. -h或--human-readable 以K,M,G为单位,提高信息的可读性。 (常用)
8. -x或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
9. -L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
10. -S或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
11. -X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
12. --exclude=<目录或文件> 略过指定的目录或文件。
13. -D或--dereference-args 显示指定符号链接的源文件大小。
14. -H或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
15. -l或--count-links 重复计算硬件链接的文件。
案例:显示目录或者文件所占空间
1. root@localhost [test]# du
2. 608 ./test6
3. 308 ./test4
4. 4 ./scf/lib
5. 4 ./scf/service/deploy/product
6. 4 ./scf/service/deploy/info
7. 12 ./scf/service/deploy
8. 16 ./scf/service
9. 4 ./scf/doc
10. 4 ./scf/bin
11. 32 ./scf
12. 8 ./test3
13. 1288 .
只显示当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的1288为当前目录的总大小。
案例:显示指定文件所占空间
1. [root@localhost test]# du log2012.log
2. 300 log2012.log
案例:查看指定目录的所占空间
1. [root@localhost test]# du scf
2. 4 scf/lib
3. 4 scf/service/deploy/product
4. 4 scf/service/deploy/info
5. 12 scf/service/deploy
6. 16 scf/service
7. 4 scf/doc
8. 4 scf/bin
9. 32 scf
案例:显示多个文件所占空间
1. [root@localhost test]# du log30.tar.gz log31.tar.gz
2. 4 log30.tar.gz
3. 4 log31.tar.gz
案例:只显示总和的大小
1. [root@localhost test]# du -s
2. 1288 .
3.
4. [root@localhost test]# du -s scf
5. 32 scf
案例:显示总和的大小且易读 (常用)
[root@ecs1 ~]# du -sh /var/
6.6G /var/
[root@ecs1 ~]#
cat命令(查看文本文件内容)
显示文本文件中所有数据。
cat 2个重要应用
1.查看小文件内容;
2.配合重定向>实现多个文件内容的合并;
格式:
cat [OPTION]... [FILE]...
常见选项:
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
-E, --show-ends #-E:显示行结束符$
display $ at end of each line
-v, --show-nonprinting #如果里面含有中文,则会出现乱码;
use ^ and M- notation, except for LFD and TAB
-T, --show-tabs # -T参数会用^I字符组合去替换文中的所有制表符。
display TAB characters as ^I
-A, --show-all #-A:显示所有控制符
equivalent to -vET
案例:cat -/E/T/v/A 用法
结论:
我们每次在linux上执行脚本前,首先要判断一个shell脚本是否存在问题(是否有在windows环境下做过配置,即可能出现过换行操作)可以直接用cat -v shell.sh进行判断?(通过现象可判断,如果是中文格式的话,每行末尾都会出现^M字样!!!)
[root@test ~]# cat -v fa.txt
abc
123
M-fM-^HM-^QM-gM-^HM-1M-dM-8M--M-eM-^[M-= #如果里面含有中文,则会出现乱码;
或者直接使用cat -A shell.sh进行判断即可!
特别注意:Linux控制符包括行结束符$
和tab符^I
。
**测试过程1:**以下为linux格式文件,包含tab键,中文:
[root@test ~]# cat fa.txt
abc
123
我爱中国
[root@test ~]# cat -E fa.txt #-E:显示行结束符$
abc$
123 $
$
$
我爱中国$
[root@test ~]# cat -T fa.txt # -T参数会用^I字符组合去替换文中的所有制表符。
abc
123^I^I
我爱中国
[root@test ~]# cat -v fa.txt
abc
123
M-fM-^HM-^QM-gM-^HM-1M-dM-8M--M-eM-^[M-= #如果里面含有中文,则会出现乱码;
[root@test ~]# cat -A fa.txt
abc$
123^I^I$
$
$
M-fM-^HM-^QM-gM-^HM-1M-dM-8M--M-eM-^[M-=$ #-A:显示所有控制符
[root@test ~]#
[root@test ~]# ll fa.txt
-rw-r--r--. 1 root root 25 Feb 3 10:09 fa.txt
[root@test ~]# file fa.txt
fa.txt: UTF-8 Unicode text
[root@test ~]# hexdump -C fa.txt
00000000 61 62 63 0a 31 32 33 09 09 0a 0a 0a e6 88 91 e7 |abc.123.........|
00000010 88 b1 e4 b8 ad e5 9b bd 0a |.........|
00000019
[root@test ~]#
**测试过程2:**以下为lwin格式文件,包含tab键,中文:(在windows上新创建一个文件,编码格式可以设置我ANSCii)
[root@test ~]# cat win.txt
abc
123
ϒ°®ţ£¬א¹[root@test ~]# cat -E win.txt
$bc
$23
$
$
ϒ°®ţ£¬א¹[root@test ~]# cat -T win.txt
abc
123^I^I
ϒ°®ţ£¬א¹[root@test ~]# cat -v win.txt #通过现象可判断,如果是中文格式的话, 每行末尾都会出现^M字样!!!
abc^M
123 ^M
^M
^M
M-NM-RM-0M-.M-DM-cM-#M-,M-VM-PM-9M-z[root@test ~]# cat -A win.txt
abc^M$
123^I^I^M$
^M$
^M$
M-NM-RM-0M-.M-DM-cM-#M-,M-VM-PM-9M-z[root@test ~]#
[root@test ~]# ll win.txt
-rw-r--r--. 1 root root 28 Feb 3 10:14 win.txt
[root@test ~]# file win.txt
win.txt: ISO-8859 text, with CRLF line terminators
[root@test ~]# hexdump -C win.txt
00000000 61 62 63 0d 0a 31 32 33 09 09 0d 0a 0d 0a 0d 0a |abc..123........|
00000010 ce d2 b0 ae c4 e3 a3 ac d6 d0 b9 fa |............|
0000001c
[root@test ~]#
案例:cat -n/b/s 用法(关于行号显示)
-n:对显示出的每一行进行编号
-b:非空行编号
-s:压缩连续的空行成一行
[root@test ~]# cat -n f.txt #-n:(1)对显示出的每一行进行编号
1 a
2 b
3 c
4
5
6 d
7 e
8
9
10 f
11 g
12 h
[root@test ~]# cat -b f.txt #-b:(2)非空行编号 等价于 nb f.txt命令
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
[root@test ~]# cat -s f.txt #-s:(3)压缩连续的空行成一行
a
b
c
d
e
f
g
h
[root@test ~]#
案例:cat 1.txt 2.txt > 12.txt #配合重定向>实现多个文件内容的合并
[root@test ~]# ll
total 8
-rw-r--r-- 1 root root 4 Feb 2 20:43 1.txt
-rw-r--r-- 1 root root 9 Feb 2 20:43 2.txt
[root@test ~]# cat 1.txt
zxl
[root@test ~]# cat 2.txt
iloveyou
[root@test ~]# cat 1.txt 2.txt > 12.txt #配合重定向>实现多个文件内容的合并;文件顺序代表合并后内容的先后顺序;
[root@test ~]# cat 12.txt
zxl
iloveyou
[root@test ~]#
tac命令
(逆向显示文本内容(注意,是按行逆向的))
案例:tac file 逆向显示文本内容。
[root@centos76 ~]#cat fa.txt
1
2
3
4
5
[root@centos76 ~]#tac fa.txt
5
4
3
2
1
[root@centos76 ~]#
案例:tac接受标准输入命令
root@centos76 ~]#tac
a
b
c
#这里输入要输入完的命令后,按ctrl d后,即可实现逆向效果:
c
b
a
[root@centos76 ~]#
案例:tac接收来自管道的内容
[root@centos76 ~]#seq 5
1
2
3
4
5
[root@centos76 ~]#seq 5|tac
5
4
3
2
1
[root@centos76 ~]#
tee命令
"tee"命令是一个在Unix和Linux系统中常用的命令,它从标准输入读取数据,并将其写入一个文件和标准输出。
下面是一些tee命令的常见用法:
-
将标准输入的内容复制到文件中:
command | tee file.txt
这样可以将命令的输出内容同时输出到屏幕和文件file.txt中。
-
在执行一个命令的同时将输出内容追加到文件中:
command | tee -a file.txt
使用"-a"选项可以将输出内容追加到文件中,而不是覆盖文件。
-
将标准输入的内容复制到多个文件:
command | tee file1.txt file2.txt file3.txt
这样可以将命令的输出内容同时输出到屏幕和多个文件中。
-
使用tee命令的输出作为其他命令的输入:
command1 | tee file.txt | command2
这里,命令command1的输出会被tee命令复制到屏幕和文件file.txt中,同时也作为命令command2的输入。
这些只是tee命令的一些基本用法,还有其他一些选项和用法可以进一步定制和扩展tee命令的功能。你可以在终端中输入"man tee"来查看完整的tee命令文档。
nl命令
(显示行号,相当于cat -b)
案例:
[root@centos76 ~]#cat fa.txt
a
b
c
d
e
[root@centos76 ~]#cat -b fa.txt #-b:非空行编号
1 a
2 b
3 c
4 d
5 e
[root@centos76 ~]#nl fa.txt
1 a
2 b
3 c
4 d
5 e
[root@centos76 ~]#
rev命令
(将同一行的内容逆向显示)
案例:rev file
[root@centos76 ~]#cat fa.txt
1 2 3 4 5
a b c
[root@centos76 ~]#tac fa.txt
a b c
1 2 3 4 5
[root@centos76 ~]#rev fa.txt
5 4 3 2 1
c b a
案例:接受标准输入
[root@centos76 ~]#rev
abcdef
fedcba
^C
案例:接收从管道过来的消息
[root@centos76 ~]#echo {1..10} |rev
01 9 8 7 6 5 4 3 2 1
[root@centos76 ~]#
more命令
cat命令的主要缺陷是:一旦运行,你就无法控制后面的操作。为了解决这个问题,开发人员编写了more命令。more命令会显示文本文件的内容,但会在显示每页数据之后停下来。
more命令是分页工具。在本章前面的内容里,当使用man命令时,分页工具会显示所选的bash手册页面。和在手册页中前后移动一样,你可以通过按空格键或回车键以翻页或逐行向前的方式浏览文本文件。浏览完之后,按q键退出。
more命令只支持文本文件中的基本移动。如果要更多高级功能,可以试试less命令。
more命令可以实现分页查看文件,可以配合管道实现输出信息的分页。
more有个缺点就是:翻页到末尾后,就会马上退出去了,而less不会,因此less命令用的会多些。
格式:
more [OPTIONS...] FILE...
选项:
-d: 显示翻页及退出提示
查看时有用的命令包括:
操作 功能说明
空白键(space): 代表向下翻一页
b键 代表向上翻一页
Enter: 代表向下翻「一行』
q: 代表立刻离开more,不再显示该文件内容
Ctr1+F: 向下滚动一屏
Ctr1+B: 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
/文本 #搜索文本
n/N #跳到下一个或上一个匹配