#!/usr/bin/perl

# 递归打印目录结构

use v5.26;
use strict;
use utf8;
use autodie;
use warnings;
use Encode qw(decode encode);
use File::Spec::Functions;
use File::Basename;
use experimental 'smartmatch'; # 忽略智能匹配的错误警告
use Getopt::Long qw(GetOptions);
use Term::ANSIColor; # 递归目录结构的次数, 0全部递归
my $depath = 0;
my $help;
my $ignores; GetOptions (
"depath=i" => \$depath,
"ignores=s" => \$ignores,
"help" => \$help
); if(defined($help)){
print color('green');
say encode('utf-8', "
\t\$ atree [dir=./] [--ignores=./.atree] [--depath=0]
\t\$ atree
\t\$ atree ./lib
\t\$ atree ./lib --depath 1
\tor
\t\$ atree ./lib -d 1
\t\$ atree -i ~/.atree -d 3
");
exit;
} my $dirPath = $ARGV[0] // "./";
unless(-d -e $dirPath){
print color("red");
say encode('utf-8', "$dirPath 不是目录,或则不存在!!");
exit;
} my $ignoresFileName = ".atree";
my $ignoresPath = $ignores // catfile($dirPath, $ignoresFileName); # 默认忽视这些目录
my @ignores = (); # 读取忽略文件
sub readIgnores {
if(defined($ignoresPath) && -e $ignoresPath){
my $fh;
open $fh, "<", $ignoresPath;
while(<$fh>){
chomp;
$_ =~ s/^\s+|\s+$//g;
next if /^#/;
push @ignores, $_;
}
close $fh;
}
}
readIgnores(); sub scan {
my ($dir, $dep, $depathCount) = @_;
if($dir && -d -e $dir) {
my @files = <$dir/* $dir/.[!.]*>;
$depathCount++;
for(@files){
# next if /\.{1,2}$/g;
my $p = catfile($_);
if(-d $p){
my($filename) = fileparse($p);
unless($filename ~~ @ignores){
say "$dep$filename/";
if($depath eq 0 or $depathCount lt $depath){
scan($p, "| ".$dep."", $depathCount);
}
}
}else {
my($filename) = fileparse($p);
say "$dep$filename";
}
}
};
} scan($dirPath, "|-- ", 0);
λ atree -i ~/.atree -d 3
|-- analysis_options.yaml
|-- bin/
| |-- main.dart
|-- CHANGELOG.md
|-- lib/
| |-- dart_demo.dart
|-- pubspec.lock
|-- pubspec.yaml
|-- README.md
|-- result.html
|-- test/
| |-- dart_demo_test.dart
|-- .dart_tool/
| |-- build/
| | |-- 098d3ee73e6cc294616d3a2e2c3c81ad/
| | |-- entrypoint/
| | |-- generated/
| |-- pub/
| | |-- bin/
|-- .gitignore
|-- .local-chromium/
| |-- 672088/
| | |-- chrome-win/
|-- .packages λ cat ~/.atree
.git
node_modules

perl 打印目录结构的更多相关文章

  1. Python树形打印目录结构

    前言 这两天整理数据文件的时候发现,一层层的点击文件夹查看很繁琐,于是想写一个工具来递归打印出文件目录的树形结构,网上找了一些资料几乎都是使用的os.walk, 调试了以后发现返回的貌似的是一个“生成 ...

  2. 递归打印目录层次(java版)

    import java.io.File; public class Test { /** * * @param fileDir 根目录 * @param num 递归层次 */ private sta ...

  3. CentOS6.5菜鸟之旅:纯转载Linux目录结构

    来自:http://www.iteye.com/topic/1125162 使用linux也有一年多时间了  最近也是一直在维护网站系统主机  下面是linux目录结构说明 本人使用的是centos系 ...

  4. Centos目录结构详细版

    使用linux也有一年多时间了  最近也是一直在维护网站系统主机  下面是linux目录结构说明 本人使用的是centos系统,很久没有发表博文了 近期会整理自己所用所了解知识点,发表linux相关的 ...

  5. CentOS目录结构超详细版

    最近初学Linux 对linux的目录产生了很多疑问,看到这篇文章,让我顿时对目录有了一个清晰的认识!推荐给大家! ------------------------------------------ ...

  6. Linux目录结构【转】

    使用linux也有一年多时间了  最近也是一直在维护网站系统主机  下面是linux目录结构说明 本人使用的是centos系统,很久没有发表博文了 近期会整理自己所用所了解知识点,发表linux相关的 ...

  7. 【Linux笔记】Linux目录结构

    [Linux笔记]Linux目录结构   本文内容整理自网络,以作参考. /:根目录,位于linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib ...

  8. (大数据工程师学习路径)第一步 Linux 基础入门----目录结构及文件基本操作

    Linux 目录结构及文件基本操作 介绍 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录 ...

  9. Centos7的目录结构

    CentOS 目录结构 : /: 根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中/bin:/usr/bin: 可执行二进制 ...

随机推荐

  1. 浅析 record 使用场景

    浅析 record 使用场景 Intro 之前我们有介绍过 record 基本知识,record 会实现基于值的类型比较,最近遇到的几个问题觉得用 record 来解决会非常方便,分享一下 基于值的类 ...

  2. 洛谷P2865

    感觉此题可作为严格次短路的模板,因此来写一写 Description 给定 \(n\) 个点,\(r\) 条双向道路,求从 \(1\) 号点到 \(n\) 号点的严格次短路 Solution 维护两个 ...

  3. MySQL、SqlServer、Oracle 三种数据库的优缺点

    MySQL.SqlServer.Oracle 三种数据库的优缺点 一.MySQL 优点: 缺点: 二.SqlServer 优点: 缺点: 三.Oracle 优点: 缺点: 一.MySQL 优点: 体积 ...

  4. 当前日期减去TIMESTAMP(6)日期

    select trunc(sysdate- to_date(to_char(j.create_date,'yyyy-mm-dd'),'yyyy-mm-dd')) 相差天数 from sys_user ...

  5. (7)Linux使用注意事项

    1.Linux 严格区分大小写 和 Windows 不同,Linux 是严格区分大小写的,包括文件名和目录名.命令.命令选项.配置文件设置选项等. 2.Windows 下的程序不能直接在 Linux ...

  6. Linux 配置永久辅助IP

    1.什么是辅助IP 辅助IP来源于Linux之中,Linux的系统网卡可以支持多IP的绑定,而辅助IP多用于解耦解决服务之间的兼容性问题,常见的应用场景有: 虚拟IP,高可用飘逸: 永久临时IP解耦使 ...

  7. 快速导出jekyll博客文件进行上传部署

    快速导出jekyll博客文件进行上传部署 在使用markdown书写jekyll博客时,经常需要写一个头部信息用以让jekyll读取博文信息,这是一件比较麻烦的事,因此我使用HTML实现了一个快速导出 ...

  8. 【STM32】无法下载程序

    错误: 使用keil MDK向STM32下载时出现各种错误 Internal command error.Error:Flash download failed.  Target DLL has be ...

  9. 翻译:《实用的Python编程》00_Setup

    课程设置与概述 欢迎访问本课程(Practical Python Programming).这个页面包含一些关于课程设置的重要信息. 课程周期和时间要求 该课程最初是作为一个由讲师主导的,持续 3 - ...

  10. CF - 392 C. Yet Another Number Sequence (矩阵快速幂)

    CF - 392 C. Yet Another Number Sequence 题目传送门 这个题看了十几分钟直接看题解了,然后恍然大悟,发现纸笔难于描述于是乎用Tex把初始矩阵以及转移矩阵都敲了出来 ...