Múltiples directorios: ¿Powershell equivalente a "mkdir dir {1..9}"?

11

¿Cuál es la sintaxis para crear varios directorios con PowerShells MD (o mkdir, New-Item ...) equivalente al 'comando nix mkdir ch{1..9}es decir,

~/parent_dir/  
ch1/  
ch2/  
ch3/  
ch4/  
ch5/  
ch6/  
ch7/  
ch8/  
ch9/  

He buscado ejemplos en las páginas de manual y en obtener ayuda, pero no conozco la sintaxis de PowerShell para hacer algo tan simple. Gracias.

Señor kennedy
fuente

Respuestas:

16

¿Cuál es la sintaxis para crear múltiples directorios con PowerShell?

Use el siguiente comando:

0..9 | foreach $_{ New-Item -ItemType directory -Name $("ch" + $_) }

Cómo funciona:

  • 0..9el operador de rango .. genera la secuencia de números 0, 1, ... 9
  • los números se canalizan | al siguiente comando
  • foreach bucles (a través de cada número a su vez)
  • { ... }es un bloque de script
  • New-Item -ItemType directory -Name $("ch" + $_) crea los directorios
  • $_es una variable automática que representa el objeto actual en la tubería (el número)

Ejemplo:

> 0..9 | foreach $_{ New-Item -ItemType directory -Name $("ch" + $_) }


    Directory: F:\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       25/09/2016     14:57                ch0
d-----       25/09/2016     14:57                ch1
d-----       25/09/2016     14:57                ch2
d-----       25/09/2016     14:57                ch3
d-----       25/09/2016     14:57                ch4
d-----       25/09/2016     14:57                ch5
d-----       25/09/2016     14:57                ch6
d-----       25/09/2016     14:57                ch7
d-----       25/09/2016     14:57                ch8
d-----       25/09/2016     14:57                ch9
DavidPostill
fuente
3
No hay nada menos detallado que ingresar lo siguiente 1..9 | % $_{ md -name $("ch" + $_) }:?
Sr. Kennedy el
1
Creo que sí. Pero no soy un experto en PowerShell.
DavidPostill
1
Se ve bien, pero te sugiero que lo pruebes y veas :)
DavidPostill
1
a-HA - lo tengo 1..9 | % $_{ mv ch$_*.* ch$_ }: ^ D
Mr. Kennedy
1
@ Mr.Kennedy Un par de cosas. Debería intentar ejecutar el git addy ver qué devuelve; tenga en cuenta que $_dentro de un foreach solo está cada entrada de matriz individual del último elemento de canalización (lo que significa que el commitpaso en su ejemplo no obtendrá números sin procesar, por lo que agregar chnuevamente probablemente sea incorrecto ) Además, en su ejemplo, las confirmaciones solo se ejecutarían (?) Después de completar todas las adiciones, lo que significa que la primera confirmación obtendría todo ... Alternativamente, podría usar varias declaraciones (separadas por ;) dentro de un solo paso foreach.
Bob
22

No necesita invocar mkdir varias veces, ya que New-Itempuede tomar una variedad de rutas. Por ejemplo:

mkdir $(1..9 | %{"ch$_"})

@DavidPostill ha explicado la mayoría de los conceptos en su respuesta . Esto también aprovecha la interpolación de cadenas en lugar de realizar una concatenación explícita. Además, %se usa la taquigrafía en lugar de ForEach-Object, pero tiene el mismo significado.

Desafortunadamente, no parece haber una manera fácil de interpolar una cadena en una matriz de cadenas como en bash.

Beto
fuente
2
@DavidPostill Has explicado con mucho más detalle que yo. Esto podría ser más una adición a tu respuesta: P
Bob
2
@DavidPostill por favor no lo borre - su explicación es muy útil
Sr. Kennedy el
3
Versión de golf máximo:md(0..9|%{"ch$_"})
Ben N
2
@DavidPostill mdes un alias estándar para mkdir, que es una función de PowerShell. %, como mencionó Bob, es un alias estándar para ForEach-Object. Las cadenas entre comillas dobles interpolan variables, por lo que "ch$_"es equivalente a 'ch' + $_. Puede buscar un alias ejecutando Get-Command( gcm) en él.
Ben N
1
@ Mr.Kennedy Algo así como: 1..9 | %{"ch$_"} | %{git add "$_"; git commit -m "$_"}o 1..9 | %{$name = "ch$_"; git add "$name"; git commit -m "$name"}. Estos comentarios se están volviendo un poco largos ahora, así que si tiene más preguntas, por favor hágalas como preguntas o tal vez entre al chat.
Bob
1

Lo usaría para la versión en bucle, ya que es fácil de recordar y se puede aplicar a muchas situaciones. Incluso se puede usar para comandos múltiples.

Para un equivalente de este comando bash:

para i en {1..9}; do
mkdir ch $ i
hecho

... en el uso de PowerShell:

for($i=1;
$i -le 10;
$i++)
{md ch$i}
Osman Mamun
fuente
mamum, ¿podrías aclararlo? Me sale un error cuando ejecuto tu código desde la línea de comandos de PowerShell o, como un script de ps1: Missing opening '(' after keyword 'for'.este comando: foreach ($i in 1..9) {md ch$i}me numera los directorios "ch" apter, pero no entiendo tu "for". ..; do ... hecho "loop.
Sr. Kennedy el
El bucle for que utilicé aquí es para bash shell (/ bin / sh). Siempre cambio mi shell a bash ya que estoy acostumbrado a este shell. Para ps, debe usar una sintaxis diferente para for loop (consulte el enlace adjunto ss64.com/ps/for.html )
Osman Mamun
1
PowerShell: for($i=1; $i -le 10; $i++){md ch$i}gracias mamun, pero aún no estoy "Bourne otra vez ...";) (ni sé C ++, pero creo que entiendo qué es "$ i-le" (si es menor o igual que?) Y "$ i ++" (~ "i + = 1"?) significa y está haciendo en el comando ...
Sr. Kennedy
1
Sí, el argumento puede leerse como para (inicialice i desde 1; siempre que sea menor o igual que 1; aumente i en 1) {haga cosas de forma iterativa}
Osman Mamun
1

Crear múltiples directorios debajo del directorio actual:

mkdir ('abc','def','jkl') 

Lo anterior es una versión abreviada de lo siguiente. Observe el signo at incluido delante de la matriz de cadenas y el uso de parámetros con nombre:

mkdir -Path @('abc','def','jkl')

Y si quieres ir hasta el final, el comando nativo completo sería:

New-Item -Path @('abc','def','jkl') -ItemType Directory

Cuando uso la línea de comandos de PowerShell, uso la versión corta.

Cuando escribo un script, especialmente uno para otros (que pueden ser nuevos en PowerShell), tiendo a escribir el comando nativo completo.

Elige lo que funcione mejor para ti.

fpm
fuente