Move Files Between Document Libraries with Metadata and Version History

Requirement: Move Files Between Document Libraries with Metadata and Version History.

We have a huge document library with more than 100,000 documents, causing search crawl and latency issues. So, I decided to archive old documents into separate document libraries year-wise.

Stop: Before proceeding with any of the below method, Save your source list or library as a template without including content and create a new list from the list template, So that your source and destination libraries will look alike!

Solution 1 – Using Content and Structure page to move files with versions and Metadata:

All SharePoint versions, including MOSS 2007, SharePoint 2010, and SharePoint 2013, supports this functionality.

  • Go to Site settings >> Click on the “Content and structure” link under the Site Administration section
    sharepoint move files with version history
  • Pick the items/files to be moved, Click on Actions >> Move 
  • Select the target list or library and click “OK” to complete the move operation.

This sends files with version history and metadata to the target list.

Solution 2: Move files between document libraries programmatically using PowerShell

Let’s use a PowerShell script to move files between lists: The idea is to create a sub-folder for each Month and move documents into sub-folders based on their creation date.

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

#Get the web and List
$Web = Get-SPWeb "https://intranet.sharepoint.com/sites/Marketing/"
$SourceList = $web.Lists["Proposals"]
$TargetList = $Web.Lists["Proposal Archive 2009"]

#Get all Files Created in 2009
 $Query = '<Where><And><Geq><FieldRef Name="Created" /><Value IncludeTimeValue="TRUE" Type="DateTime">2009-01-01T00:00:00Z</Value></Geq><Leq><FieldRef Name="Created" /><Value IncludeTimeValue="TRUE" Type="DateTime">2009-12-31T23:59:59Z</Value></Leq></And></Where>'
 $SPQuery = new-object Microsoft.SharePoint.SPQuery
 #$SPQuery.ViewAttributes = "Scope='Recursive'" #To include Sub-folders in the library
 $SPQuery.Query = $Query
 $SourceFilesCollection =$SourceList.GetItems($SPQuery)

Write-host "Total number of files found: "$SourceFilesCollection.count

#Move each file to the destination folder
foreach($item in $SourceFilesCollection)
{
  #Get the Source File
  $file = $Web.GetFile($item.File.URL)

  #Get the Month value from the File created date
  $MonthValue = $item.File.TimeCreated.ToString('MMMM')
  
  # Try to Get the Sub-Folder in the Library!
  $TargetFolder = $TargetList.ParentWeb.GetFolder($TargetList.RootFolder.Url + "/" +$MonthValue);
  
  #If the folder doesn't exist, Create!
  if ($TargetFolder.Exists -eq $false)
   {
     $TargetFolder = $TargetList.Folders.Add([string]::Empty, [Microsoft.SharePoint.SPFileSystemObjectType]::Folder, $MonthValue)
     $TargetFolder.Update() 
   }

   #Move the File
   $file.MoveTo($TargetFolder.Url + "/" + $File.name)  
}
While the Move operation preserves Metadata and version history, Copy doesn’t! Also, the Explore View Drag & Drop from Source Library to destination also preserves versions.

Solution 3: Move files using SharePoint designer

  • Open your site in SharePoint Designer
  • Go to All Files >> Navigate to source library. Select files you want to copy/move, choose cut/copy
    move files using sharepoint designer
  • Go to your target library, Right click and choose “Paste”
Tips: SharePoint general rule of thumb for better performance on large list and libraries: Have < 2000 files per container (list/library/folder).

All of the above methods move documents between libraries of the same site collection! To copy files between document libraries using PowerShell, use: Copy Files Between Document Libraries in SharePoint using PowerShell

Salaudeen Rajack

Salaudeen Rajack - Information Technology Expert with Two-decades of hands-on experience, specializing in SharePoint, PowerShell, Microsoft 365, and related products. He has held various positions including SharePoint Architect, Administrator, Developer and consultant, has helped many organizations to implement and optimize SharePoint solutions. Known for his deep technical expertise, He's passionate about sharing the knowledge and insights to help others, through the real-world articles!

5 thoughts on “Move Files Between Document Libraries with Metadata and Version History

  • Do you have a copy of this for SharePoint Online using PNP Powershell?

    Reply
  • What I need to do is move folders and their contents from one library to another within the same site collection, maintaining as much metadata as possible. Will this do that?

    Reply
  • How about moving libraries between site collections?

    Reply
  • Very useful article, thanks!

    Reply
  • Thanks a lot, this is really a time saver

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *