递归扫描移动所有文件并删除空目录

递归扫描移动所有文件并删除空目录

我正在学习 bash 脚本,想将所有 *.ort 文件移动到新目录,并在 .ort 文件移动后删除该目录。

要注意:

  1. 我不需要保留相同的结构 - 我想移动到包含所有 .ort 文件的单个目录
  2. 一旦文件被移动,我就可以删除该目录,因为它只包含一个 .ort 文件,没有其他内容

我认为这会起作用,但在目录上运行 bash 脚本之前我想确认一下。

句法:

find / -iname "*.ort" -type d -exec /bin/mv {} /home/user123/Desktop/movedfiles/ \;
rmdir **/*/;

我欢迎所有关于改进或是否可行的建议和反馈:)

答案1

你可以做:

find . -type f -name '*.ort' -exec mv -i {} outdir \; -exec bash -c 'rmdir "${1%/*}"' _ {} \;
  • find . -type f -name '*.ort' -exec mv -i {} outdir \;将唯一.ort文件从源目录移动到目标目录(outdir

  • 第二个-exec操作仅在前一个操作成功(即找到并成功移动文件-exec bash -c 'rmdir "${1%/*}"' _ {} \;)时运行。您也可以将其放在一个下,但使用两个s 可以使事情更清晰一些。-exec.ort-exec&&-exec

  • 第二个-exec操作将仅删除包含该文件的空目录;${1%/*}使用 bash 参数扩展模式来获取目录名称,dirname也可以起作用。

例子:

$ tree
.
├── egg
├── ortdir1
│   └── foo.ort
├── ortdir2
│   └── bar.ort
├── outdir
└── spam

$ find . -type f -name '*.ort' -exec mv -i {} outdir \; -exec bash -c 'rmdir "${1%/*}"' _ {} \;

$ tree
.
├── egg
├── outdir
│   ├── bar.ort
│   └── foo.ort
└── spam

相关内容