删除前写入文件名

时间:2017-09-15 11:24:38

标签: bash gnu-findutils

我想删除目录中的所有.png文件,并将删除文件名保存在文本文件中。我设法使用以下命令执行此操作:

find . -name "*.png" -delete -print >> log.txt

一切正常,在日志中我删除了整个文件的路径。但是如果要删除多个文件,则放在日志中的名称都在同一行上。

C:/Users/Dragos.Cazangiu/Desktop/TesteCyg/CMDER/New Bitmap Image3.pngC:/Users/Dragos.Cazangiu/Desktop/TesteCyg/CMDER/2.pngC:/Users/Dragos.Cazangiu/Desktop/TesteCyg/CMDER/New Bitmap Image.png

如何将每个文件放在新行上,以及如何在路径之前添加消息,例如“已删除的文件是:”

谢谢!

4 个答案:

答案 0 :(得分:2)

由于您使用的是Windows(无论出于何种原因......;)),您可能需要使用-printf来生成Windows样式行结尾:

find . -name '*.png*' -delete -printf "%p\r\n" >> log.txt

或者,只需配置用于查看输出文件到UNIX行结尾的文本编辑器。

添加消息:

find . -name '*.png*' -delete -printf "Deleted: %p\r\n" >> log.txt

答案 1 :(得分:1)

  找到。 -name" *。png" -delete -print" \ n" >> log.txt的

答案 2 :(得分:1)

您可以使用此谓词替换-print谓词:

-exec printf 'The deleted file is: %s\n' {} \;

使命令看起来像:

find . -name "*.png" -delete -exec printf 'The deleted file is: %s\n' {} \; >> log.txt

如果你有GNU find,那么你可以使用-printf谓词:

find . -name "*.png" -delete -printf 'The deleted file is: %p\n' >> log.txt

答案 3 :(得分:1)

使用bash,rmyes和awk更直观(TGIF :)的方式。首先,测试一下:

$ touch 1.png 2.png 3.png

然后:

for i in *.png ; do yes | rm -i $i 2>&1 >/dev/null | awk '{gsub(/^.|..$/,"",$NF);print $NF}' >> file ; done
$ cat file
1.png
2.png
3.png

或:

for i in *.png                                       # daloop
do                                                   # yes sir
  yes |                                              # nod to pipe
  rm -i $i 2>&1 >/dev/null |                         # rm interactively piping the stderr
  awk '{ gsub(/^.|..$/,"",$NF); print $NF }' >> file # ... to awk
done                                                 # phew

如果需要,请引用$i