查找文件并删除父级别目录

时间:2015-06-29 22:21:54

标签: bash find

如何删除文件所在的父目录(上面只有一级),并使用find命令找到

find . -type f -name "*.root" -size 1M

返回

./level1/level1_chunk84/file.root

所以,我想以递归方式删除level_chunck84目录,例如..

感谢

1 个答案:

答案 0 :(得分:1)

您可以尝试以下内容:

find . -type f -name "*.root" -size 1M -print0 | \
xargs -0 -n1 -I'{}' bash -c 'fpath={}; rm -r ${fpath%%$(basename {})}'

find + xargs组合很常见。请参阅man find,您将找到一些示例,说明如何一起使用它们。

我在这里所做的只是将-print0标志添加到原始查找语句中:

  

-print0                真正;在标准输出上打印完整文件名,后跟空字符(而不是-print的换行符)                使用)。这允许程序正确解释包含换行符或其他类型的空格的文件名                处理查找输出。此选项对应于xargs的-0选项。

然后将所有内容传送到xargs,作为辅助工具来制作更多命令:
- 执行bash子shell中的所有内容 - 将文件路径分配给变量fpath={}
- 从文件路径中提取dirname

  

$ {参数%%字}                删除匹配的后缀模式。这个词被扩展为产生一个模式,就像路径名扩展一样。如果模式匹配                参数的扩展值的尾部,则扩展的结果是参数的扩展值                最短匹配模式(%'' case) or the longest matching pattern (the %%'' case)已删除。如果参数是@或*,则                模式删除操作依次应用于每个位置参数,扩展是结果列表。如果参数是                一个用@或*下标的数组变量,模式删除操作依次应用于数组的每个成员,并且                扩展是结果列表。

- 最后以递归方式删除

还有一个更短的版本:

find . -type f -name "*.root" -size 1M -print0 | \
xargs -0 -n1 -I'{}' bash -c 'fpath={}; rm -r ${fpath%/*}'