![递归扫描移动所有文件并删除空目录](https://linux22.com/image/1055491/%E9%80%92%E5%BD%92%E6%89%AB%E6%8F%8F%E7%A7%BB%E5%8A%A8%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%B9%B6%E5%88%A0%E9%99%A4%E7%A9%BA%E7%9B%AE%E5%BD%95.png)
我正在学习 bash 脚本,想将所有 *.ort 文件移动到新目录,并在 .ort 文件移动后删除该目录。
要注意:
- 我不需要保留相同的结构 - 我想移动到包含所有 .ort 文件的单个目录
- 一旦文件被移动,我就可以删除该目录,因为它只包含一个 .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