根据列表删除指定目录下的文件

function delete_files(){
    root="$1"
    deletes_filename="$2"
    deletes_script="${deletes_filename/.txt/.sh}"

    cd $root
    cat "$deletes_filename" | sed 's/[[:cntrl:]]//g;' | grep -v "^$" | grep -v "^#" | xargs -I@ echo "find @ -printf 'remove %p\n' -delete" > "${deletes_script}"
    bash "${deletes_script}" >> "${logfile}" 2> /dev/null

    cd - > /dev/null 2>&1
}
这是一个名为 `delete_files` 的 Bash 函数,用于删除指定目录下的特定文件。

### 函数解释

1. `function delete_files(){`


   * 定义一个名为 `delete_files` 的 Bash 函数。
2. `root="$1"`


   * 将函数的第一个参数(即要删除文件的根目录)赋值给变量 `root`。
3. `deletes_filename="$2"`


   * 将函数的第二个参数(即包含要删除文件列表的文件名)赋值给变量 `deletes_filename`。
4. `deletes_script="${deletes_filename/.txt/.sh}"`


   * 使用参数扩展(parameter expansion)将 `deletes_filename` 变量中的 `.txt` 扩展为 `.sh`,并将结果赋值给变量 `deletes_script`。这意味着,如果第二个参数是一个以 `.txt` 结尾的文件名,那么这个脚本会创建一个以 `.sh` 结尾的临时脚本文件。
5. `cd $root`


   * 切换到 `root` 指定的目录。
6. `cat "$deletes_filename" | sed 's/[[:cntrl:]]//g;' | grep -v "^$" | grep -v "^#" | xargs -I@ echo "find @ -printf 'remove %p\n' -delete" > "${deletes_script}"`


   * 这行命令较为复杂,可以分为几个部分来解释:
      + `cat "$deletes_filename"`:读取 `deletes_filename` 文件的内容。
      + `sed 's/[[:cntrl:]]//g;'`:使用 `sed` 命令删除所有控制字符。
      + `grep -v "^$"`:使用 `grep` 命令排除空行。
      + `grep -v "^#"`:使用 `grep` 命令排除以 `#` 开头的行(通常用于注释)。
      + `xargs -I@ echo "find @ -printf 'remove %p\n' -delete"`:使用 `xargs` 命令将前面过滤后的每一行作为参数传递给 `find` 命令,并生成一个 `find` 命令的列表。每个 `find` 命令都会查找相应的文件或目录,并使用 `-printf` 和 `-delete` 选项来打印将要删除的文件路径并删除它们。
      + `> "${deletes_script}"`:将生成的 `find` 命令列表写入到 `deletes_script` 文件中。
7. `bash "${deletes_script}" >> "${logfile}" 2> /dev/null`


   * 使用 `bash` 命令执行 `deletes_script` 文件中的命令。
   * `>> "${logfile}"`:将命令的标准输出追加到 `logfile` 文件中。注意,这里的 `logfile` 变量没有在函数中定义,它可能是一个全局变量或在函数外部定义的变量。
   * `2> /dev/null`:将命令的标准错误输出重定向到 `/dev/null`,即忽略错误输出。
8. `cd - > /dev/null 2>&1`


   * 使用 `cd -` 命令返回到函数执行前的目录。
   * `> /dev/null 2>&1`:将命令的标准输出和标准错误输出都重定向到 `/dev/null`。
9. `}`


   * 函数定义结束。

### 使用示例

假设你有以下文件结构:
/home/user/
└── to_delete.txt
在 `to_delete.txt` 文件中,你有以下内容:
*.log
dir1/
dir2/*.txt
你可以通过以下方式调用 `delete_files` 函数:
delete_files /home/user/ to_delete.txt
这将删除 `/home/user/` 目录下的所有 `.log` 文件,`dir1/` 目录及其所有内容,以及 `dir2/` 目录下的所有 `.txt` 文件。同时,所有的删除操作都会被记录在 `logfile` 文件中(假设它在此上下文中已经被定义并指向了一个有效的文件路径)。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值