我有一个Accounts
包含邮件帐户的文件夹,所有这些文件夹都有一个文件夹Archive.folder
。我想使用一个简单的脚本将所有存档文件夹移动到一个新文件夹。
我到目前为止尝试过:
find . -mindepth 1 -maxdepth 1 ! -name archive -exec mv -t testnew/ {} +
但是它会移动所有文件夹,而不仅仅是名为 archive 的文件夹。我想找到当前名为 archive 的文件夹中的所有文件夹,并将它们移动到文件夹 testnew/。移动文件夹的路径应与之前相同。
现有情况:
Accounts
- 1
- archive
- inbox
- folder2
- 2
- archive
- inbox
- folder2
- 3
- archive
- inbox
- folder2
它看起来应该是这样的:
testnew
- 1
- archive
- 2
- archive
- 3
- archive
答案1
如果可以以交互方式执行此操作,这vidir
可能是一个好方法。请参阅这个答案。
对于你的情况,流程如下:
cd /path/to/Accounts find . -type d -name archive | vidir -
vidir
将运行文本编辑器。使用“搜索和替换”并将每个前导替换./
为您想要的任何路径,以便行符合您想要的目录结构。路径可以是绝对路径或相对路径,它们可能包含../
。例如,您可以轻松地将其转换为./1/archive ./2/archive ./3/archive
进入这个
../testnew/1/archive ../testnew/2/archive ../testnew/3/archive
保存编辑的文件并退出编辑器。
笔记:
- 如果您的目录结构包含以 结尾的目录
.
(因此./
子字符串不仅出现在开头),则最好用 替换<TAB>./
,<TAB>whatever/path/you/want/
其中<TAB>
表示制表符。是否/如何在“搜索和替换”中包含此字符取决于编辑器。 - 通过指定来选择您的编辑器
EDITOR
,例如find … | EDITOR=kate vidir -
。 vidir
无法在文件系统之间移动文件。如果所有archive
目录都属于一个文件系统,而您想要testnew
将其移至另一个文件系统,则请testnew
在源文件系统中创建,然后使用vidir
,最后移至testnew
目标文件系统。- 在......的最后这是另一个答案有一种实验方法可以(滥用)
EDITOR
来使交互变得vidir
不可交互。然而我发现vidir
它在您这样的案例中很有用,主要是因为它允许我在进行任何重命名/移动之前确保生成的路径确实是我想要的。如果我搞砸了什么,我可以中止而不保存更改。如果您想要一个非交互式的解决方案来解决您的问题那么这vidir
不是最好的工具。