Kevin Lemaire Asked: 2018-01-27 01:53:21 +0800 CST2018-01-27 01:53:21 +0800 CST 2018-01-27 01:53:21 +0800 CST 查找匹配模板的文件并删除 772 我有大量的文件夹和文件。我需要对其进行解析并仅找到具有扩展名的那些xmp以最终将其删除。 我怎样才能做到这一点并跟踪已删除文件的名称? 查找:我知道我可以使用find /path -name "*.xmp" 但是如何在输出上运行两个命令?保留文件路径和名称removelist.txt并将其删除。 files find 3 个回答 Voted Best Answer RomanPerekhrest 2018-01-27T02:11:06+08:002018-01-27T02:11:06+08:00 使用 GNU查找 -fprint和-delete操作: find . -name "*.xmp" -fprint "removelist.txt" -delete -fprint file- 将完整的文件名打印到文件file中。如果运行file时不存在find,则创建;如果确实存在,则将其截断。 -delete- 删除文件 B Layer 2018-01-27T02:01:17+08:002018-01-27T02:01:17+08:00 一种方法是使用以下命令执行复合 shell 命令-exec: find /path -name '*.xmp' -exec sh -c 'echo "$1" >> removelist.txt && rm -f "$1"' sh {} \; 在子 shell 中echo(附加到removelist.txt)和rm将针对每个找到的文件运行。 注意:最后一个sh是因为我们使用的是-c. 使用该标志,后面的第一个参数是参数 0 或者$0应该是 shell 的名称。 必须承认,@RomanPerekhrest 对于这种特殊情况有一个更好的答案,但是使用这里的技术,您可以做各种可能没有专用find标志的事情。:) Stéphane Chazelas 2018-01-27T04:44:52+08:002018-01-27T04:44:52+08:00 要记录已成功删除的文件,您可以执行以下操作: find . -name '*.xmp' -exec rm -f {} \; -print > removed.txt 仅当操作成功-print时才会运行该-exec操作,即如果rm成功。 在某些find实现中,您可以将 替换为-exec rm -f {} \;以-delete避免为每个文件运行一个命令并避免一些竞争条件(最初是 FreeBSD 扩展,但现在受到 GNUfind和其他一些支持)。
使用 GNU查找
-fprint
和-delete
操作:-fprint file
- 将完整的文件名打印到文件file
中。如果运行file
时不存在find
,则创建;如果确实存在,则将其截断。-delete
- 删除文件一种方法是使用以下命令执行复合 shell 命令
-exec
:在子 shell 中
echo
(附加到removelist.txt
)和rm
将针对每个找到的文件运行。注意:最后一个
sh
是因为我们使用的是-c
. 使用该标志,后面的第一个参数是参数 0 或者$0
应该是 shell 的名称。必须承认,@RomanPerekhrest 对于这种特殊情况有一个更好的答案,但是使用这里的技术,您可以做各种可能没有专用
find
标志的事情。:)要记录已成功删除的文件,您可以执行以下操作:
仅当操作成功
-print
时才会运行该-exec
操作,即如果rm
成功。在某些
find
实现中,您可以将 替换为-exec rm -f {} \;
以-delete
避免为每个文件运行一个命令并避免一些竞争条件(最初是 FreeBSD 扩展,但现在受到 GNUfind
和其他一些支持)。