Linux脚本攻略学习笔记之dd、删除重复文件以及chmod和chown实例演示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whandgdh/article/details/84765114

一、dd

dd全称 Disk Dump 磁盘存储

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

在这里插入图片描述

if 代表输入文件(input file),
of 代表输出文件(output file), bs 代表以字节为单位的块大小(block size), count 代表需要被
复制的块数

使用 dd 命令时一定得留意,该命令运行在设备底层。要是你不小心出了岔子,搞不好会把磁盘清空或是损坏数据。所以一定要反复检查 dd 命令所用的语法是否正确,尤其是参数 of=

块大小可以使用各种计量单位,下表可以字符可以置于数字之后来指定字节数。200c 表示200字节
字节(1B) c
字(2B) w
块(512B) b
千字节(1024B) k
兆字节(1024KB) M
吉字节(1024MB) G

/dev/zero 是一个字符设备,它会不断返回0值字节( \0 )

如果不指定输入参数( if ),默认情况下 dd 会从 stdin 中读取输入。与之类似,如果不指定
输出参数( of ),则 dd 会将 stdout 作为默认输出

也可以用 dd 命令传输大量数据并观察命令输出来测量内存的操作速度(例如,在前一个例子
中所示的 1048576字节(1.0 MB)已复制,0.000747119 秒,1.4 GB/秒)

二、删除重复文件

1、创建测试文件

echo "hello" >test;
  cp test test_cp1;
  cp test test_cp2;
 echo "other" >other
  ll

在这里插入图片描述

扫描二维码关注公众号,回复: 5941851 查看本文章

2、脚本代码:

# !/bin/bash

#文件名: remove_duplicates.sh
#用途: 查找并删除重复文件,每一个文件只保留一份
ls -lS --time-style=long-iso | awk ‘BEGIN {
getline; getline;
name1=$8; size=$5
}
{
name2=$8;
if (size==$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 " 2" " }’ | sort -u > duplicate_sample
echo Removing…
comm duplicate_files duplicate_sample -2 -3 | tee /dev/stderr | xargs rm
echo Removed duplicates files successfully.

在这里插入图片描述

ls -lS 对当前目录下的所有文件按照文件大小进行排序,并列出文件的详细信息。 awk 读取
ls -lS 的输出,对行列进行比较,找出重复文件。

在这里插入图片描述

我们用 getline 读取第1行 文件数量,然后丢弃,由于需要对每一行及其下一行来比对文件大小,因此用 getline 读取长文件列表的第一行,并存储文件名和大小(它们分别是第8列和第5列)。这样我们就先得
到了一行。接下来, awk 进入 {} 语句块(在这个语句块中读取余下的文本行),读取到的每一行文本都会执行该语句块。它将当前行中读取到的文件大小与之前存储在变量 size中的值进行比较。如果相等,那就意味着两个文件至少在大小上是相同的,随后再用md5sum 执行进一步的检查。tee 命令在这里有一个妙用:它在将文件名传递给 rm 命令的同时,也起到了 print 的作用。tee 将来自 stdin 的行写入文件,同时将其发送到 stdout 。我们也可以将文本重定向到 stderr来实现终端打印功能。/dev/stderr是对应于 stderr (标准错误)的设备。通过重定向到 stderr设备文件,来自 stdin 的文本将会以标准错误的形式出现在终端中

三、文件权限、所有权和粘滞位

3.1、chmod

假设需要设置权限: rwx rw- r–
在这里插入图片描述
chmod g=rw file_power/
chmod o=r file_power/
u ——指定用户权限
g ——指定用户组权限
o ——指定其他实体权限
在这里插入图片描述

3.1.2、对用户、用户组和其他用户用 + 进行添加权限,用 - 删除权限

再把刚刚的文件 其他实体用户加上w权限

chmod o+w file_power

补充: chmod a+x filename 其中, a 表示全部(all)

删除权限 chmod a-x file_power

3.1.3、 用八进制数来设置权限

权限由3位八进制数来表示,每一位按顺序分别对应用户、用户
组和其他用户。
读、写和执行权限都有与之对应的唯一的八进制数:
r-- = 4
-w- = 2
–x = 1
我们可以将权限序列的八进制值相加来获得所需的权限组合,例如:
rw- = 4 + 2 = 6
r-x = 4 + 1 = 5

权限序列 rwx rw- r-- 的数字表示形式如下:
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 = 6
r-- = 4
因此, rwx rw- r-- 等于764,那么使用八进制值设置权限的命令为
chmod 764 file_power
在这里插入图片描述

2、chown

这个命令只能由系统管理者(root)使用
chown user.group filename
chown slynux.slynux test.sh
在这里, slynux 既是用户名,也是用户组名。

2.1.1、以递归方式设置权限

有时候需要以递归的方式修改当前目录下的所有文件和子目录的权限。选项 -R(recursion) 指定以递归的方式修改权限

$ chmod 777 . -R
$ chown user.group  file_directory -R

2.1.2、以不同的身份运行可执行文件

有一个叫做 setuid 的特殊文件权限,它允许其他用户以文件所有者的身份来执行文件。
在wanghao 用户下创建test.sh脚本
cat test.sh

#!/bin/bash
echo Root user execute this file

然后在root 用户下修改文件所有权为root 
chown root /home/wanghao/study/file_power/test.sh 
然后执行  增加执行权限 
chmod  +x  /home/wanghao/study/file_power/test.sh 
再执行 
chmod  +s  /home/wanghao/study/file_power/test.sh 

在这里插入图片描述

在原来的用户下不能执行
在这里插入图片描述

setuid 的使用不是无限制的。为了确保安全,它只能应用在Linux ELF格式二进制文件上

猜你喜欢

转载自blog.csdn.net/whandgdh/article/details/84765114