Equivalentes en PowerShell a comandos de Linux

Si provienes del mundo GNU/Linux y tienes cierta experiencia en el manejo de su línea de comandos es posible que al empezar con PowerShell busques instintivamente herramientas parecidas a las que ya conoces para usarlas. La buena notícia es que Microsoft se ha encargado de facilitar lo máximo posible la transición de una shell a la otra, por lo que en la entrada de hoy revisaremos una serie de cmdlets equivalentes en PowerShell a comandos de Linux así como sus alias.

Equivalentes en PowerShell a comandos de Linux

Antes de empezar: diferencias entre sistemas operativos

Si bien en la introducción he apuntado que Microsoft ha facilitado muchísimo la transición para alguien que proviene del mundo GNU/Linux hacia PowerShell hay que tener en cuenta que las diferencias entre GNU/Linux y Windows son muy grandes.

GNU/Linux es un sistema operativo basado en texto. Cualquier configuración se realiza editando archivos de texto y es por ello que bash está repleto de herramientas para manipularlo. Herramientas que además, después de realizar sus modificaciones, devuelven texto.

Windows es un sistema operativo basado en objetos. Dada la base del sistema operativo, PowerShell está lleno de de herramientas orientadas a tratar con objetos. Herramientas que, una vez realizadas sus operaciones, devuelven objetos.

Es por ello que, si bien PowerShell también ofrece herramientas para tratar con texto, hay que tener en cuenta que éstas probablemente no sean la primera opción a escoger, puesto que la salida de nuestro comando probablemente nos estará devolviendo objetos y no texto.

Lista de equivalentes en PowerShell a comandos Linux

Con esta aclaración hecha podemos ponernos con las equivalencias:

Sistema de archivos

Aquí vamos a enumerar los distintos cmdlets relacionados con la gestión del sistema de archivos.

# cd

Para cambiar de directorio en PowerShell tenemos Set-Location:

PS C:\Script> Set-Location C:\Scripts

Alias: cd, chdir, sl

# ls

Para listar el contenido de un directorio en PowerShell podemos utilizar Get-ChildItem:

PS C:\Script> Get-ChildItem C:\Scripts


    Directorio: C:\Scripts


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       09/12/2018     20:58              0 Bienvenido a Sobrebits.txt

Alias: dir, gci, ls

# pwd

Si queremos obtener nuestra ubicación actual disponemos de Get-Location:

PS C:\Scripts> Get-Location

Path
----
C:\Scripts

Alias: gl, pwd

# find

El equivalente a find en PowerShell es, al igual que para listar el contenido de una carpeta, Get-ChildItem pero en esta ocasión con el modificador -Filter (y añadiendo -Recurse si queremos buscar de forma recursiva):

PS C:\Scripts> Get-ChildItem 'C:\Scripts' -Filter '*Bienvenido a sobrebits*' -Recurse


    Directorio: C:\Scripts\Carpeta


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       09/12/2018     21:08              0 Bienvenido a sobrebits.txt

Alias: dir, gci, ls

# touch, mkdir, cp, move y rm

Para crear un nuevo archivo o carpeta (touch y mkdir) disponemos de New-Item, para copiar un archivo o carpeta (cp) disponemos de Copy-Item, para mover un archivo o carpeta (mv) tenemos Move-Item y para eliminar un archivo o carpeta (rm) disponemos de Remove-Item:

PS C:\Scripts> New-Item -ItemType File Sobrebits.txt
PS C:\Scripts> New-Item -ItemType Directory 'Sobrebits folder'
PS C:\Scripts> Copy-Item .\Sobrebits.txt .\Sobrebits2.txt
PS C:\Scripts> Move-Item .\Sobrebits2.txt .\Sobrebits3.txt
PS C:\Scripts> Remove-Item *.txt

Alias New-Item: ni
Alias Copy-Item: copy, cp, cpi
Alias Move-Item: mi, move, mv
Alias Remove-Item: del, erase, rd, ri, rm, rmdir

Manipulación de archivos

# cat

Para mostrar el contenido de un archivo en PowerShell utilizaremos Get-Content:

PS C:\Scripts\Carpeta> Get-Content '.\Bienvenido a sobrebits.txt'
¡Gracias por visitar el blog y compartir!

Alias: cat, gc, type

# tail y head

Tanto para mostrar el final de un archivo (tail) como para mostrar el principio de un archivo (head) en PowerShell utilizaremos Get-Content con los parámetros -Tail y -TotalCount respectivamente:

PS C:\Scripts\Carpeta> Get-Content '.\Bienvenido a sobrebits.txt' -Tail 10
PS C:\Scripts\Carpeta> Get-Content '.\Bienvenido a sobrebits.txt' -TotalCount 10

Alias: cat, gc, type

# grep

Si queremos utilizar el equivalente a grep en PowerShell deberemos utilizar Select-String con el parámetro -Pattern:

PS C:\Scripts\Carpeta> 'Bienvenido','a','Sobrebits'
Bienvenido
a
Sobrebits
PS C:\Scripts\Carpeta> 'Bienvenido','a','Sobrebits' | Select-String -Pattern 'Sobrebits'

Sobrebits

Alias: sls

# diff

Si queremos mostrar las diferencias entre dos archivos tal como lo hace diff usando PowerShell podemos utilizar Compare-Object:

PS C:\Scripts\Carpeta> Compare-Object '.\Bienvenido a sobrebits.txt' '.\Bienvenido a sobrebits2.txt'

Alias: compare, diff

Utilidades

# wget

Para utilizar una funcionalidad parecida a la de wget en PowerShell deberemos utilizar Invoke-WebRequest con el parámetro -OutFile:

PS C:\Scripts> Invoke-WebRequest https://sobrebits.com -OutFile sobrebits.html

Alias: curl, iwr, wget

# curl

Si lo que queremos es utilizar una funcionalidad similar a curl en PowerShell disponemos de Invoke-WebRequest y de Invoke-RestMethod en el caso de que queramos interactuar con una API REST:

PS C:\Scripts> Invoke-WebRequest https://sobrebits.com
PS C:\Scripts> Invoke-RestMethod https://sobrebits.com -Method Get

Alias Invoke-WebRequest: curl, iwr, wget
Alias Invoke-RestMethod: irm

# man

Si queremos consultar la ayuda en PowerShell podemos valernos de Get-Help:

PS C:\Scripts> Get-Help -Name Invoke-WebRequest

Alias: help, man (realmente help y su alias man son aliases de Get-Help añadiendo paginación de los resultados)

# tee

Si queremos guardar la salida de un comando a un archivo y seguir pasándolo por nuestro pipeline podemos utilizar Tee-Object:

PS C:\Scripts> 'Bienvenido a Sobrebits' | Tee-Object -FilePath 'C:\Scripts\Bienvenido a sobrebits.txt'

Alias: tee

# scp

Si bien para SCP no existe una herramienta nativa en PowerShell que la reemplace podemos tirar de WinSCP para PowerShell como vimos en entradas anteriores:

PS C:\Scripts> Receive-WinSCPItem -WinSCPSession $WinScpSession -RemotePath "/tmp/sobrebits.txt" -LocalPath 'C:\Windows\Temp'

Conclusión

Si bien la lista puede seguir y seguir creo que esta es una buena representación de los principales equivalentes en PowerShell a comandos en Linux para cualquier persona recién aterrizada en PowerShell desde el sistema operativo del pingüino. Algo importante a tener en cuenta es que en casi todos los casos existe un alias igual al comando de Linux al que ‘sustituye’, por lo que la transición puede ser muy sencilla.

¡Si echáis de menos algún comando os animo a que lo dejéis en los comentarios!

Deja un comentario