Linux Shell 学习(三) 以文件之名

Linux Shell 学习(三) 以文件之名

1. 文件

1.1 生成文件(大小任意)

# dd 命令
dd if=/dev/zero of=junk.data bs=1M count=1

##参数介绍
if(input file): 输入源,默认为stdin, /dev/zero一直输出 0
of(output file): 输出文件,默认为stdout
bs:文件块大小
    b 块(512B)
    c 字节(1B)
    w 字(2B)
count: 文件块数量

1.2 文件的集合操作

并 交 差

# comm 命令
# 不做介绍

1.3 查找并删除重复文件

@!/bin/bash
#fileName: DeleteRepeatFile.sh

# 创建测试文件
echo "hello" > testFile.data;
cp testFile.data testFile1.data
cp testFile.data testFile2.data

echo "other" > testFile.other

# 删除重复文件操作
ls -lS | awk 'BEGIN {
    getline;
    getline;
    name1=$8;
    size1=$5;
}
{
    name2=$8;
    if (size1 ==  $5){
            "md5sum "name1 | getline; csum1=$1;
            "md5sum "name2 | getline; csum2=$1;
            if(csum1 == csum2){
                    print name1;
                    print name2;
            }
    }

    size=$5; name1=name2;

}' | sort -u > duplicate_files

cat duplicate_files | xargs -I { } md5sum | sort | uniq -w 32 | awk '{print "^"$2"$"}' | sort -u  >duplicate_sample

echo Removing duplicate files.....
comm duplicate_files duplicate_sample -2 -3 | tee /dev/stderr |xargs
rm
echo remove success

1.4 创建长路径目录

mkdir 命令

创建 /home/slynux/test/hello/child

# 方法一
mkdir /home/slynux 2>/dev/null
mkdir /home/slynux/test 2>/dev/null
....
mkdir /home/slynux/test/hello/child 2>/dev/null


# 方法二
mkdir -p /home/slynux/test/hello/child

1.5 文件权限 所有权 粘滞位;

1.5.1 文件权限

使用 ls -l 命令可以列出文件权限

Linux Shell 学习(三) 以文件之名_第1张图片

查看输出结果的每一行的前10个字符:
    第一个字符表示文件的类型,包括:
        d   目录
        -   普通文件
        l   符号链接
        p   管道
    后面每三个字符为一组分为三组:
        第一组表示用户权限
        第二组表示用户所在的组中用户权限
        第三组表示其他用户的权限
    权限分为三种:可读r 可写w 可执行x (如果没有对应权限,显示为 - )

详情参照LinuxShell预热

1.5.2 设置文件权限

使用 chmod 命令改变文件权限

chmod u=rwx g=rw o=r fileName
u 对应 user权限
g 对应 用户组权限
o 对应 其他用户权限

#可以使用 - + 对权限进行添加删除
chmod o-x filename
chmod a-x filename      #a 表示所有用户的权限

#递归方式改变目录下所有的文件权限
chmod a+x dirpath -R
1.5.3 设置文件所有权

使用 chown 命令改变文件权限

chown usergroup.username filename
1.5.4 设置文件粘滞位

粘滞位是应用于目录权限类型。设置了粘滞位的目录,只有目录文件的所有者才能删除目录中的文件。其他用户即使拥有足够的权限也不能执行删除操作

chmod a+t filename
1.5.5 设置文件文件不可修改

使用 chattr 命令改变文件权限

# 将文件设置为不可修改
chattr +i filename

# 将文件设置为可修改
chattr -i filename

1.6 批量生成空白文件

使用 touch 命令生成空白文件,当文件存在时,改变文件的修改时间戳

#创建新的文件
touch filename


# touch 命令可以修改文件的相关时间戳
touch -a        只修改文件的访问时间戳
touch -m        只修改文件的修改时间戳

1.7 链接文件 环回文件

1.7.1 链接文件

使用命令 ln 可以创建链接文件

# 命令模板
ln -s srcfile dstlinkfile

1.7.2 环回文件

环回文件:将文件作为存储设备挂载到文件系统中,访问对应的设备就是访问文件中内容,这样的文件称之为 环回文件

比如,将iso光盘文件挂载到文件系统中,即可访问iso文件中的内容,无序像windows一样需要使用虚拟光驱软件进行加载

1.7.2.1 创建文件

使用命令 dd

# 创建大小为1G的文件
dd if=/dev/zero of=loopbackfile.img bs=10MB count=1
# 参数
if 输入文件
of 输出文件
bs 块大小
count 块个数
块大小和块个数共同决定了创建的文件的大小
1.7.2.2 格式化文件

使用命令mkfs格式化文件

# mkfs.ext4 filename
mkfs.ext4 loopbackfile.img
1.7.2.3 检查文件类型

使用命令file检查文件类型

# file filename
file loopbackfile.img

这里写图片描述

1.7.2.4 挂载文件

使用命令mount挂载文件

# 创建目录
sudo mkdir /mnt/loopback

# 进行挂载
mount -o loop loopbackfile.img /mnt/loopback

1.8 文件差异

对于一个文件有多个版本时,对不同版本进行比较就比较重要了。比如文件有10000行,人工比较几乎是不可能的。相较于不同的文件,同一文件的不同版本之间的差异比较小,彼此之间可以通过差异文件(只记录不同部分的信息 => patch file)来相互转换

1.8.1 获取文件差异信息

命令diff可以获取文件的差异信息

diff -u file1 file2
# 参数 -u 使输出更加

# diff 命令同样适用于比较目录文件
diff -Naur dir1 dir2


# 通过重定向可以将patch信息输出到文件
diff -u file1 file2 > diff.patch

1.8.2 文件patch

命令patch可以

# 应用patch信息
patch -pl file1 < diff.patch
# 得到file2

# 两次进行pathc 文件不会更改 (负负得正)
patch -pl file1 < diff.patch            # 得到file2
patch -pl file1 < diff.patch            # 得到file1

1.9 文件打印 head tail

1.9.1 打印文件的前几行

使用head命令可以只打印文件的前部几行的内容

# 打印文件前十行内容
head filename

# 指定打印的行数
head -n 5 filename

# 打印除了最后N行之外的内容
head -n -N filename
# 参数 -N 为负数

1.9.2 打印文件的后几行

使用tail命令可以只打印文件的尾部几行的内容

# 打印文件后十行内容
tial filename

# 指定打印的行数
tial -n 5 filename

# 打印除了前N行之外的内容
tail -n -N filename
# 参数 -N 为负数

tail更常用做读取不断更新的文件,上文所描述的命令在执行后会马上退出。tail命令使用 -f 参数指定 可以一直将文件更新的内容显示出来

假设有进程foo在一段时间内不断对filename进行追加内容

$pid = $(pidof foo)
tail -f filename --pid $pid
# 当进程foo结束后 tail命令也会跟着结束

1.10 文件统计 wc

wc(world count)是一个统计命令,可以用来统计文件的行数 单词数 字符数

1.10.1 统计文件行数

wc -l filename

# 可以使用stdin作为输入源
cat filename | wc -l

1.10.2 统计文件单词数

wc -w filename

# 可以使用stdin作为输入源
cat filename | wc -w

1.10.3 统计文件字符数

wc -c filename

# 可以使用stdin作为输入源
cat filename | wc -c

1.10.4

当不使用任何参数时,wc将打印所有的统计信息

使用wc filename -L将打印文件中最长的行的长度

2. 目录操作实践

2.1 只打印目录

ls -d */

-d 表名只是输出目录文件

*/ 是正则匹配,即匹配以‘/’结尾的目录文件

ls -F | grep “/$”

使用参数 -F 时, ls命令的输出会在文件名之后添加特殊符号表示文件类型,比如” / @ * “。然后通过 管道 将ls命令的输出输入到grep命令中,grep进行正则表达式的匹配,将成功匹配的进行输出

ls -l | grep “^d”

使用参数 -l 时, ls命令的输出的每一样第一个字符表示文件类型,字符d表示该文件的文件类型是目录,。然后通过管道将ls命令的输出输入到grep命令中,grep进行正则表达式的匹配,将成功匹配的进行输出

find . -type d -maxdepth 1 -print

-type d 指定文件类型为目录, -maxdepth 1表示仅在当前目录下查找目录文件

2.2 tree命令

使用tree命令,可以打印出目录的结构

可能centos上没有预装tree命令

# 安装命令
yum insrtall tree

# 使用命令
tree dirpath

2.2.1

# 只标记匹配的文件
tree dirpath -p pattern

# 不标记匹配的文件
tree dirpath -I  pattern

# 同时打印出文件的大小
tree -h dirpath

# 以 HTML形式输出
tree . -H ../var/www -o treeresult.html
## 如果你安装了apace服务器,可以访问 IP/treeresult.html 查看输出结果
## 或者使用vim查看输出文件内容

3. 快速定位

在涉及多个目录的操作时,频繁的使用cd命令,会让人很恼火。此时,有命令popdpushd可以提供快速切换工作目录的操作

pushd popd命令以堆栈的数据结构对工作目录尽行操作

3.1 pushd

使用命令pushd将路径压入堆栈

# pushd dir
pushd /var/www
## 将路径压入

3.2 查看目录堆栈内容

使用命令dirs查看目录堆栈内容

dirs
# shuchu
/var/www    /etc  /root
0           1     2

# 需要更换工作目录时,使用pushd命令
pushd +1    
## 工作目录将切换到 /etc 目录

3.3 移除路径

使用命令popd移除堆栈top目录,并切换到下一目录(新的top目录)

# 命令格式
popd

3.4 两个目录之间的切换

popd pushd 命令适合在多个

当在两个工作目录之间切换时,使用命令 cd - 更加合适

Linux Shell 学习(三) 以文件之名_第2张图片

你可能感兴趣的:(linux)