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` 文件中(假设它在此上下文中已经被定义并指向了一个有效的文件路径)。