移动文件夹和子文件夹中与 Basename 文件相关的所有文件

移动文件夹和子文件夹中与 Basename 文件相关的所有文件

我将这些文件放入一个文件夹中:

Enero.01200.2019.txt
Enero.01200.2019.pdf
Enero.01200.2019.png
Febrero.03100.2019.txt
Febrero.03100.2019.pdf
Febrero.03100.2019.png

每个 .txt 文件里面都有一个值表示订单未付款,我需要清除未付款订单的日志文件夹,例如我使用此命令在运行前对 output.sh 进行检查:

find /log/users/ -name '*.txt' | xargs grep -l unpaid | awk '{print "mv "$1" /tmp/ }' >> clearlog.sh

我需要打印例如这个:

mv /log/users/Enero.01200.2019.txt /tmp/ && mv /log/users/Enero.01200.2019.pdf /tmp/ && mv /log/users/Enero.01200.2019.png /tmp/

如果有人有更好的方法来做到这一点,但要求确认或查看会发生什么情况,我会很感激。

大约有 2,500 个文件需要清除,我不会删除错误的文件而造成混乱。

注意:所有 txt 文件都有 PDF 和 PNG 相关文件。我在 ubuntu 20.04 服务器上工作

提前致谢!

答案1

如果所有文件都在一个目录级别中,则建议使用一个简单的 shell 循环,根据grep退出状态有条件地移动文件,例如

for f in /log/users/*.txt; do
  grep -q unpaid "$f" && echo mv -t /tmp/ -- "$f" "${f%.txt}.pdf" "${f%.txt}.png"
done

echo一旦您确认它做了正确的事情,就将其删除)。

如果需要使用递归方式下降到父目录find,那么同样

find /log/users/ -name '*.txt' -exec sh -c '
  for f do grep -q unpaid "$f" && echo mv -t /tmp/ -- "$f" "${f%.txt}.pdf" "${f%.txt}.png"; done
' find-sh {} +

相关内容