newLISP 删除目录

这是个很简单的需求,可是API只提供了一个几乎没什么用的函数

remove-dir 要求目录必须为空, 99%的情况是目录不为空。

因此我写了一个函数来递归删除目录树:

(define (make-sure-folder-path-end-of-slash dir-path)
  (if (!= (last dir-path) "/")
      (push "/" dir-path -1)
    )
  dir-path
)

(define (no-sub-files dir-path)
  (not (directory dir-path {[^(\.$)]})))

(define (delete-dir dir-path)
  ;; check dir-path
  (unless (directory? dir-path)
    (throw-error (string dir-path " folder does not exist")))

  ;; append slash to dir-path
  (set ‘dir-path (make-sure-folder-path-end-of-slash dir-path))

  ;; process sub files
  (let (sub-files (directory dir-path {[^(\.$)]}))
    (if sub-files
	(begin
	 ;; iterate all sub files
	 (dolist (nde sub-files)
	   (if (directory? (append dir-path nde))
	       (delete-dir (append dir-path nde) file-op ext-context)
	     (let (file-path (append dir-path nde))
	       (println (string "delete file " file-path ": " (file-info file-path)))
	       (delete-file file-path ext-context))))
	 (if (no-sub-files dir-path)
	     (begin
	      (println (string "delete folder " dir-path ": " (file-info dir-path)))
	      (remove-dir dir-path))
	     )
	 )
      (begin
       (println "no sub files in " dir-path " folder, delete this folder")
       (remove-dir dir-path))
      )
    )
)

测试方法:

[email protected]:~/Downloads$ mkdir -p x/x2/x3; touch x/x2/x3/z;touch x/x2/m;touch x/.sss; touch x/a.x;
[email protected]:~/Downloads$ tree x -a
x
├── a.x
├── .sss
└── x2
    ├── m
    └── x3
        └── z

2 directories, 4 files

然后执行newlisp函数:

> (delete-dir "/home/dean/Downloads/x")
delete file /home/dean/Downloads/x/a.x: (0 33204 0 1000 1000 1409987071 1409987071 1409987071)
delete file /home/dean/Downloads/x/x2/x3/z: (0 33204 0 1000 1000 1409987071 1409987071 1409987071)
delete folder /home/dean/Downloads/x/x2/x3/: (4096 16893 0 1000 1000 1409987075 1409987075 1409987075)
delete file /home/dean/Downloads/x/x2/m: (0 33204 0 1000 1000 1409987071 1409987071 1409987071)
delete folder /home/dean/Downloads/x/x2/: (4096 16893 0 1000 1000 1409987075 1409987075 1409987075)
delete file /home/dean/Downloads/x/.sss: (0 33204 0 1000 1000 1409987071 1409987071 1409987071)
delete folder /home/dean/Downloads/x/: (4096 16893 0 1000 1000 1409987075 1409987075 1409987075)
true
时间: 2024-10-19 18:42:00

newLISP 删除目录的相关文章

使用NewLisp设计Key-Value数据库系统

Lisp是一个很好的语言,最强大的就是其S-表达式,可以说是Lisp能活到今天的唯一一个原因.其次就是函数为基本类型和后来的闭包.当然Lisp也有很大的缺点,即:一般的设计师难以避免Lisp的缺点. Lisp有很多方言,很多子系列,可以说百花齐放,也可以说是散沙一盘.这就是Lisp的优点之一,同时也是其缺点之一,但是这些缺点主要是用Lisp的人造成的,而之所以会这样,是因为Lisp太容易滥用了(其缺点正是因为其优点导致的). NewLisp是一个非常强大的Lisp实现,也可以称为一个方言,是一个

newLISP处理mysql escape character

什么是转义字符 mysql的escape character指的是需要转义的特殊字符,这些字符出现在sql语句中,如果没有转移会导致sql语法报错或者有sql注入攻击的可能. 主要有以下几种都需转义: \x00, \n, \r, \, ', " and \x1a. 比如' 就需要变成\' 下面是sql测试: mysql> INSERT INTO nodes(name) VALUES ('select a.dt, count(*), count(distinct a.uv) from (se

创建目录和删除目录

命令:mkdir   ;  rmdir  :  tree mkdir ----make directory 语法: mkdir [-mp] [目录名称] mkdir 如果后面不加选项,直跟目录,会在最后目录的上一级建立子目录,若上一级不存在则不能建立,即不能建立一连串的目录. 如要建立一连串目录,可使用 mkdir -p [目录名称]  .  mkdir -v [目录名称]  意思是建立过程可视化. [[email protected] ~]# mkdir 234 [[email protect

PHP-递归扫描目录和删除目录

(1) 通过递归扫描目录并打印 // php递归扫描目录 function scanMyDir($path){ // 打开目录 $dh = opendir($path); echo '<ul>'; // 循环读取目录 while(($file = readdir($dh)) !== false){ // 先要过滤掉当前目录'.'和上一级目录'..' if($file == '.' || $file == '..') continue; // 为了能够显示中文目录/文件,需要进行转码 echo

PHP建立和删除目录

<?php/*linux中的文件权限filedir 用户 组 其它 rwx rwx rwx 读写执行 6 4 6 读写 读 读写 7 7 7 rw_ r__ rw_ r__ _w_ ___ r = 4 w = 2 x = 1 chmod 777 filename chmod 644 filename */ //shell方式创建和删除目录 exec("mkdir /hello"); exec("rm -rf /hello"); //创建目录 mkdir(&qu

在NewLisp中实现匿名函数的递归

匿名函数在很多语言中的表现形式大概如下: (lambda (n)   (* (+ n 1) (- n 1))) 只有参数列表和函数体,而没有名字.在大部分情况下没问题,但是一旦需要用到递归的话,就有点麻烦了,因为不知道如何去递归的调用一个匿名函数. 在学术界中有一些解决这个问题的办法,其中一个就是Y组合子,但是那个太繁琐,而且难以通过宏自动将一个lambda变成可递归形式,没什么好处. 根据历史经验,目前比较好的办法,就是实现一个操作符,匿名函数通过这个操作符来调用自身: (lambda (n)

newLISP数据拟合

有时候需要拟合数据,比如某周五的数据因故无法生成, 可以用下面的算法简单拟合. 计算前两周的周四,周五的环比(邻比), 两个邻比求平均后加1, 乘以 周四的数据,得到周五的数据. 用newLISP实现代码很简单: 参考下面的示例: #!/usr/bin/newlisp (define (adjacent-div a b) (div (sub b a) a)) (define (average a b) (div (add a b) 2)) (define (fitting a b c d e)

MapReduce 编程 系列十二 用Hadoop Streaming技术集成newLISP脚本

本文环境和之前的Hadoop 1.x不同,是在Hadoop 2.x环境下测试.功能和前面的日志处理程序一样. 第一个newLISP脚本,起到mapper的作用,在stdin中读取文本数据,将did作为key, value为1,然后将结果输出到stdout 第二个newLISP脚本,起到reducer的作用,在stdin中读取<key, values>, key是dic, values是所有的value,简单对value求和后,写到stdout中 最后应该可以在HDFS下看到结果. 用脚本编程的

Jenkins 输入字符串给newLISP 作为参数使用问题

比如 需要生成sqoop import语句,用newlisp脚本: (set 'import-cmd (format "%s/sqoop-import --options-file media_options.txt --table %s --where \"ID = 2\" --target-dir %s -m 1 --fields-terminated-by '%s' --lines-terminated-by '\\n'" sqoop-path table-n