shell学习3

news2024/10/2 12:22:43

目录

一、查找并删除重复文件

二、列举文件类型统计信息

三、只列出目录


一、查找并删除重复文件

重复文件是同一个文件的多个副本。有时候我们需要删除重复的文件,只保留其中一份。通过查看文件内容来识别重复文件是件挺有意思的活儿。可以结合多种shell工具来完成这项任务。在这则攻略中,我们讨论如何查找重复文件并根据查找结果执行相关的操作。

我们可以通过比较文件内容来识别它们。校验和是依据文件内容来计算的,内容相同的文件自然会生成相同的校验和,因此,我们可以通过比较校验和来删除重复文件。

 

 脚本:

#!/bin/bash
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"$" }' | sort -u > duplicate_sample

echo Removing..
comm duplicate_files duplicate_sample -2 -3 | tee /dev/stderr | xargs rm
echo Removed duplicates files successfully.

运行结果:

 

代码理解:

1、ls -lS   对当前目录下的所有文件按照文件大小进行排序,并列出文件的详细信息

--time-style=long-iso  显示日期和时间(包括年),以长格式显示yyyy-mm-dd hh:mm:ss

 

2、awk

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;
}'

第一个 getline 读取第1行,然后丢弃。也就是说第一个getline会读取到total 16 并删除。

第二个getline 读取到第2行,然后把第2行的第八列赋值给name1,把第5列赋值给size。

第二个getline 读取到第3行,然后把第三行的第八列赋值给name2,把第5列与size进行比较。如果比较结果是大小相等。那么md5sum name1 就会计算出name1的md5值,并把结果的第一列(结果有两列,第一列是文件的md5值,第二列是文件名。)赋值给csum1;类似的,csum2变量存储的就是name2文件的md5值。如果name1和name2的文件的md5值是相同的,就打印name1和name2.否则就把当前行的第五列赋值给size。当前行的第八列赋值给name1。也就是说,第2行和第3行比较,第3行和第2行比较。

在 awk 中,外部命令的输出可以用下面的方法读取:"cmd"| getline

3、sort

sort 默认是从小到大排序

sort -u  可以排序去重

4、xargs

xargs -I    指定每一项命令行参数的替代字符串.

 cat duplicate_files | xargs -I {} md5sum {}等价于test  md5sum、test_copy1  md5sum。

5、uniq -w  32

将每一行的前32个字符进行比较,如果相同就删除。 (md5sum输出中的前32个字符, md5sum 的输出通常由32个字符的散列值和文件名组成)

 

6、tee /dev/stderr

tree 命令在这里有一个妙用:它在将文件名传递给 rm 命令的同时,也起到了 print 的作用。
tee 将来自 stdin 的行写入文件,同时将其发送到 stdout 。我们也可以将文本重定向到 stderr
来实现终端打印功能。/dev/stderr是对应于 stderr (标准错误)的设备。通过重定向到 stderr
设备文件,来自 stdin 的文本将会以标准错误的形式出现在终端中


二、列举文件类型统计信息

编写一个脚本,使它能够遍历目录中所有的文件,并生成一份关于文件类型细节以及每种文件类型数量的报告。

脚本:

#!/bin/bash
# 文件名:filestat.sh
if [ $# -ne 1 ];
then
echo "Usage is $0 basepath";
exit
fi

path=$1
declare -A statarray;

while read line;
do
ftype=`file -b "$line" | cut -d, -f1`
let statarray["$ftype"]++;
done < <(find $path -type f -print)

echo ============ File types and counts =============
for ftype in "${!statarray[@]}";
do
echo $ftype : ${statarray["$ftype"]}
done

运行:

 

 代码理解:

1、declare -A statarray;

声明一个关联数组statarray

2、find $path -type f -print

将当某目录及其子目录中的所有文件列出并打印

 

3、file -b

辨识文件类型,列出辨识结果时,不显示文件名称

 

4、cut -d , -f1

以逗号为分割符,取出第一个。

 

5、let statarray["$ftype"]++;

用文件类型作为数组索引,将每种文件类型的数量存入数组。每次遇到一个文件类型,就用 let 增加计数

 6、${!statarray[@]} 

列出关联数组的所有索引

7、<(find $path -type f -print)

<(find $path -type f -print) 等同于文件名。只不过它用子进程输出来代替文件名。
注意,第一个<用于输入重定向,第二个<用于将子进程的输出装换成文件名。在两个<之间有一
个空格,避免shell将其解释为<<操作符。


三、只列出目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阶段六:服务框架基础(第二章Day-MQ(服务异步通讯))

阶段六&#xff1a;服务框架基础&#xff08;第二章Day-MQ&#xff08;服务异步通讯&#xff09;&#xff09;Day-RabbitMQ1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比&#xff1a;2.快速入门2.1.安装RabbitMQ 【重要】2.1.1、安装RabbitMQ&#xff0…

换掉 Maven,我就用Gradle,急速编译

相信使用Java的同学都用过Maven&#xff0c;这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven&#xff0c;可能会发现Maven有一些地方用的让人不太舒服&#xff1a; Maven的配置文件是XML格式的&#xff0c;假如你的项目依赖的包比较多&#xff0c;那么XML文件就…

[Datawhale][CS224W]图机器学习(六)

目录一、简介二、概述三、算法四、PageRank的缺点五、Python实现迭代法参考文献一、简介 PageRank&#xff0c;又称网页排名、谷歌左侧排名、PR&#xff0c;是Google公司所使用的对其搜索引擎搜索结果中的网页进行排名的一种算法。 佩奇排名本质上是一种以网页之间的超链接个…

蒙特卡洛随机模拟

蒙特卡洛随机模拟 简介 蒙特卡洛模拟是在计算机上模拟项目实施了成千上万次&#xff0c;每次输入都随机选择输入值。由于每个输入很多时候本身就是一个估计区间&#xff0c;因此计算机模型会随机选取每个输入的该区间内的任意值&#xff0c;通过大量成千上万甚至百万次的模拟…

笔记本触摸板没反应怎么办?处理方法看这些

触摸板在笔记本电脑中是非常重要的一部分&#xff0c;很多用户都会选择使用触摸板代替鼠标。然而&#xff0c;有时你可能会发现&#xff0c;你的笔记本电脑触摸板没反应&#xff0c;无法正常使用。这对于日常使用来说是非常困扰的&#xff0c;但不用担心&#xff0c;我们将在这…

JavaScript BOM【快速掌握知识点】

目录 Window对象的常用属性 语法&#xff1a; Window对象的常用方法 语法&#xff1a; open()和close()方法 History对象 常用属性和方法 示例 Location对象 常用属性 常用方法 Document对象的常用方法 定时函数 超时调用&#xff1a;setTimeout() 间歇调用&…

插件化框架shadow——腾讯

theme: cyanosis Shadow简介 Shadow是最近腾讯开源的一款插件化框架。原理是使用宿主代理的方式实现组件的生命周期。目前的插件化框架&#xff0c;大部分都是使用hook系统的方式来做的。使用代理的基本上没有成体系的框架&#xff0c;只是一些小demo&#xff0c;Shadow框架的…

【华为OD机试模拟题】用 C++ 实现 - 查找单入口空闲区域(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明查找单入口空闲区域题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明示例

在linux中web服务器的搭建与配置

以下涉及到的linux命令大全查阅 https://www.runoob.com/linux/linux-command-manual.htmlvim命令查阅 https://www.runoob.com/linux/linux-vim.htmlscp命令https://www.runoob.com/linux/linux-comm-scp.html首先要有一个请求的服务地址用ssh 进入到linux系统中ssh 请求的服务…

JavaWeb Servlet Cookie和Session

6、Servlet 6.1、Servlet简介 Servlet就是sun公司开发动态web的一门技术Sun在这些API中提供一个接口叫做&#xff1a;Servlet&#xff0c;如果你想开发一个Servlet程序&#xff0c;只需要完成两个小步骤&#xff1a; 编写一个类&#xff0c;实现Servlet接口把开发好的Java类部…

Redis 4种集群方案介绍+优缺点对比

前言在服务开发中&#xff0c;单机都会存在单点故障的问题&#xff0c;即服务部署在一台服务器上&#xff0c;一旦服务器宕机服务就不可用&#xff0c;所以为了让服务高可用&#xff0c;分布式服务就出现了&#xff0c;将同一服务部署到多台机器上&#xff0c;即使其中几台服务…

【LeetCode】剑指 Offer 17. 打印从1到最大的n位数 p114 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/ 1. 题目介绍&#xff08;17. 打印从1到最大的n位数&#xff09; 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则打印出 1、2、3 一直…

<JVM上篇:内存与垃圾回收篇>12 - 垃圾回收相关概念

笔记来源&#xff1a;尚硅谷 JVM 全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解 java 虚拟机&#xff09; 文章目录12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出&#xff08;OOM&#xff09;内存泄漏&#xff08;Memory Leak&#xff…

【Linux驱动开发100问】Linux驱动开发工程师在面试中常被问到的问题汇总

&#x1f947;今日学习目标&#xff1a;什么是Kconfig&#xff1f;如何使用Kconfig&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;Lin…

针对面试官的盘问-如何回答职场中的一些问题

(点击即可收听)初入职场,面对面试官的提问,如何回答01你为什么从上家公司离职?个人成长不足,不符合自己的预期&#xff08;关系到个人竞争力,希望找到一份更有挑战,个人提升更大的工作&#xff09;,切忌与面试官倒苦水,说前公司老板的不是业务发展缓慢,上升空间有限(有些不符合…

【华为OD机试模拟题】用 C++ 实现 - 不等式(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明不等式题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD …

正态分布、Q函数、误差函数erf()和互补误差函数erfc()

1、正态分布&#xff08;高斯分布&#xff09; 若随机变量 X服从一个位置参数为 μ、尺度参数为 σ 的概率分布&#xff0c;且其概率密度函数为 则这个随机变量就称为正态随机变量&#xff0c;正态随机变量服从的分布就称为正态分布&#xff0c;记作 X∼N(μ,σ2) 。 当μ0,σ…

【Opencv-python】之入门安装

目录 一、安装Python 1. 登录官网https://www.python.org/downloads/ 2. 任选一个版本&#xff0c;下载Python 3. 安装Python 记得勾选下图的Add Python 3.6 PATH, 添加python到环境变量的路径&#xff0c;然后选择Install now​编辑 4. 验证是否安装成功 5.退出 二、安装…

【华为OD机试模拟题】用 C++ 实现 - 路灯照明(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明路灯照明【华为OD机试模拟题】题目输入输出描述示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…

Redis源码---键值对中字符串的实现,用char*还是结构体

目录 前言 为什么 Redis 不用 char*&#xff1f; char* 的结构设计 操作函数复杂度 SDS 的设计思想 SDS 结构设计 SDS 操作效率 紧凑型字符串结构的编程技巧 小结 前言 对于 Redis 来说&#xff0c;键值对中的键是字符串&#xff0c;值有时也是字符串在 Redis 中写入一…