我有大量的文件夹和文件。我需要解析它并只找到那些具有扩展名的文件xmp
以最终删除它们。
我怎样才能实现这一点并跟踪已删除文件的名称?
查找:我知道我可以使用find /path -name "*.xmp"
但是如何在输出上运行两个命令?保留文件路径和名称removelist.txt
并将其删除。
答案1
与GNU找到的 -fprint
和-delete
行动:
find . -name "*.xmp" -fprint "removelist.txt" -delete
-fprint file
- 将完整文件名打印到 file 中file
。运行时如果file
不存在find
则创建;如果确实存在,则会被截断。-delete
- 删除文件
答案2
要记录已成功删除的文件,您可以执行以下操作:
find . -name '*.xmp' -exec rm -f {} \; -print > removed.txt
仅当操作成功(即成功)时,该-print
操作才会运行。-exec
rm
在某些find
实现中,您可以替换为,-exec rm -f {} \;
以-delete
避免为每个文件运行一个命令并避免一些竞争条件(最初是 FreeBSD 扩展,但现在由 GNUfind
和其他一些扩展支持)。
答案3
一种方法是使用以下命令执行复合 shell 命令-exec
:
find /path -name '*.xmp' -exec sh -c 'echo "$1" >> removelist.txt && rm -f "$1"' sh {} \;
在子 shell 内,两者echo
(附加到removelist.txt
)rm
将针对每个找到的文件运行。
注意:最后一个sh
是因为我们正在使用-c
.对于该标志,后面的第一个参数是 param 0 或$0
应该是 shell 的名称。
必须承认,@RomanPerekhrest 对于这个特殊情况有一个更好的答案,但是使用这里的技术,你可以做各种可能没有专用find
标志的事情。:)