使用 shell 脚本将特定子目录移动到新文件夹

使用 shell 脚本将特定子目录移动到新文件夹

我有一个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可能是一个好方法。请参阅这个答案

对于你的情况,流程如下:

  1. cd /path/to/Accounts
    find . -type d -name archive | vidir -
    
  2. vidir将运行文本编辑器。使用“搜索和替换”并将每个前导替换./为您想要的任何路径,以便行符合您想要的目录结构。路径可以是绝对路径或相对路径,它们可能包含../。例如,您可以轻松地将其转换为

    ./1/archive
    ./2/archive
    ./3/archive
    

    进入这个

    ../testnew/1/archive
    ../testnew/2/archive
    ../testnew/3/archive
    
  3. 保存编辑的文件并退出编辑器。

笔记:

  • 如果您的目录结构包含以 结尾的目录.(因此./子字符串不仅出现在开头),则最好用 替换<TAB>./<TAB>whatever/path/you/want/其中<TAB>表示制表符。是否/如何在“搜索和替换”中包含此字符取决于编辑器。
  • 通过指定来选择您的编辑器EDITOR,例如find … | EDITOR=kate vidir -
  • vidir无法在文件系统之间移动文件。如果所有archive目录都属于一个文件系统,而您想要testnew将其移至另一个文件系统,则请testnew在源文件系统中创建,然后使用vidir,最后移至testnew目标文件系统。
  • 在......的最后这是另一个答案有一种实验方法可以(滥用)EDITOR来使交互变得vidir不可交互。然而我发现vidir它在您这样的案例中很有用,主要是因为它允许我在进行任何重命名/移动之前确保生成的路径确实是我想要的。如果我搞砸了什么,我可以中止而不保存更改。如果您想要一个非交互式的解决方案来解决您的问题那么这vidir不是最好的工具。

相关内容