Managing Files with PowerShell 7 on Linux

powershell hero img

Since Microsoft open-sourced PowerShell in 2016, running it on Linux has become not only easier but a core part of the PowerShell roadmap. With PowerShell 7 in development, the stated goal is to make PowerShell accessible from not only Windows but Mac and Linux.

While PowerShell 7 is still in development, it’s a good time to go over how to do some of the most essential tasks you can do on a Linux server: managing files.

Prerequisites

You’ll get hands-on in this article so to ensure you can follow along, be sure you have the following prerequisites in place:

  • A device running Linux. The examples shown in this article are run on Ubuntu 18.04.
  • PowerShell 7 installed on Linux.

Understanding Bash vs PowerShell

Before you dive into the different ways PowerShell 7 can manage files, let’s first cover how Linux and PowerShell work with the Linux filesystem. Each has a different way of working with files and directories. Depending on what kind of operations you want to take, these differences can be important to know as you’ll soon find out.

For example, if you need to list files in Linux, you can either use the Bash ls command or the PowerShell Get-ChildItem command as you can see below. There are some slight differences that will be covered in this section, but for now, either will help you navigate around your file system.

You can see using the ls command in the screenshot below, it’s only showing names. Contrast that with using the PowerShell Get-ChildItem command which is showing more information like the time the items were last modified, where they are located, and what size the file is.

Untitled 0c6987e2 2658 4f69 959c 18675251ee53

Bash commands only return strings while PowerShell returns an entire object. When that output is an object, it can then be filtered by using other methods on that object like using the Where-Object command, for example.

PowerShell also gives you an easy way to verify what is being returned with the Get-Member cmdlet. You can see below the kind of object each command produces.

PS /home/user1> Get-Item ./ThisIsAFile | Get-Member
TypeName: System.IO.FileInfo
--snip--

PS /home/user1> ls ./ThisIsAFile | Get-Member
TypeName: System.String
--snip--

Since PowerShell is returning the entire object, you have more options available to you in terms of how to query and change information of that object.

For example, suppose you wanted to get the date a file was last modified. In Bash, the easiest way to do that would be to use the date command as shown in the screenshot below. If you want to format that string for any reason, you would have to construct how to format it as a string.

With PowerShell, the property that contains the last modified date is also a .NET DateTime object. There is a large variety of methods available for date manipulation, including direct string formatting as shown in the screenshot below.

Untitled 25297eb9 028f 43d4 b706 7ecc0a7f8a17

Managing the File System

With a better understanding of the differences between Bash and PowerShell, now you are ready to go through the different types of items in the file system.

Directories

Bash and PowerShell differ a bit in the commands requires to manage directories.

A directory is another word for folder in the Windows file ecosystem, but directory is the preferred term in the Linux lexicon. Bash and PowerShell have commands that do roughly the same operations on directories but with some differences in syntax.

Below are some of the more common operations and the Bash commands and PowerShell cmdlets to perform them:

Directory commands

It’s important to note that in PowerShell 7 running on a Linux device, either Bash commands or PowerShell cmdlets will run, but on a Windows device, Linux commands are aliases of the cmdlets. That means that the cmdlets will return a directory object on either platform, but using the bash command will only return an object on Windows.

Files

Files are arguably the most important item in this list as that’s where your data and configuration live. Some of the commands that PowerShell and Bash use to operate files are similar to the ones used for directories with some different flags and options.

Below are some of the Bash commands and PowerShell cmdlets that you can use to work with files. These commands are similar to working with directories. For example, cp and Copy-Item still perform the same task, but there is no need to use a -r or -Recurse flag. If you are familiar with the directory commands, you are most of the way toward working with files.

File commands (From the parent folder)

Symlinks, or symbolic links, are files that don’t have any content of their own. Instead, they point to files that are somewhere else in on the filesystem. While not as popular in the Windows ecosystem, they are extremely popular for Linux administrators.

Symlinks are useful from referencing the same file in multiple directories to Linux executables which may be in a directory that’s not on the system path.

Fortunately, PowerShell can also handle symlinks as demonstrated in the screenshot below. In PowerShell, symlinks are treated as file objects and can be read, copied and moved like any other file. If a symlink is modified, it will make the changes on the source file. Try not to use them for write-intensive applications!

Untitled 46

Summary

In this article, we’ve covered how Bash and PowerShell 7 treat directories, files, and symlinks differently on Linux systems. You’ve also learned how to use PowerShell cmdlets and Bash commands to manage items in the file system.

If you haven’t yet downloaded and installed PowerShell 7 and begin managing files, what are you waiting for?