Sé que una característica común de los nombres de archivo de un número de archivos no deseados en mi ordenador con Windows. ¿Cómo puedo eliminar todos estos archivos de una carpeta determinada o la jerarquía de carpetas con un solo expresión regular comando de PowerShell?

InformationsquelleAutor Techrocket9 | 2014-05-20

3 Comentarios

  1. 37

    Puede canalizar un comando Get-ChildItem a través de un where-Object filtro que acepta una Expresión regular de patrón y, a continuación, la tubería que en Remove-Item. Creo que va a llegar de un modo más rápido y de mejor resultado que el uso de Select-Cadena. Con un comando como:

    Get-ChildItem $Path | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item

    El Nombre de atributo de sólo coincidirá con el nombre del archivo o de la carpeta, junto con un archivo de extensión. No igualará en contra de otras cosas a lo largo de la ruta. De este modo se pasa un objeto FileInfo abajo de la tubería, la cual Remove-Item toma como corriente de entrada y extraer los archivos en cuestión.

    Si quieres incluir subcarpetas de tu ruta tendría que añadir el -Recurse cambiar a su comando Get-ChildItem, y tendría este aspecto:

    Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>"} | Remove-Item

    Si sólo quieres borrar los archivos que usted puede especificar que en la sentencia where mirando el objeto FileInfo del PSIsContainer de la propiedad y la inversión se prefijando el objeto con un signo de exclamación como tales:

    Get-ChildItem $Path -Recurse | Where{$_.Name -Match "<RegEx Pattern>" -and !$_.PSIsContainer} | Remove-Item
  2. 4

    Puede utilizar el comando,

    ls -name | select-string -pattern ".*\(\d+\).*" | %{rm $_}

    Donde el contenido de las comillas es la expresión regular. El regex en este ejemplo busca los archivos que tienen (#) en el nombre de archivo, donde # es cualquier número entero no negativo. Esto es útil para eliminar los duplicados en una carpeta en el mismo conjunto de archivos se han vertido muchas veces, como por ejemplo, un administrador de música.

    Si agrega una -r después de que el nombre de

    ls -name -r | select-string -pattern ".*\(\d+\).*" | %{rm $_}

    se deben recorrer las subcarpetas y eliminar archivos coincidentes en todas las subcarpetas.

    La estructura del comando es la siguiente:

    • ls es un alias para el comando de powershell get-childitem. Enumera todos los elementos en la carpeta actual. El argumento-name especifica que sólo los nombres se deben producir; no quiero otra información como el tamaño del archivo.
    • seleccione cadena es principalmente equivalente a grep de UNIX, donde coincide con un patrón (regex) a un montón de línea separados por cadenas. El patrón de parámetro establece el cmdlet para tomar un regex.
    • %{rm $} es un bucle foreach. Es decir, «para cada línea de corriente dentro de mí (de seleccionar la cadena en este caso)», realice la siguiente acción, donde $ es la línea dada. En este caso estamos rm-ción del elemento, donde rm es un alias para Eliminar Elemento.
    • Seleccione de Cadena está diseñado para la búsqueda de información en archivos. Devuelve MatchInfo objetos que contienen información como el nombre de archivo y número de línea donde se encontró la coincidencia. En este contexto, toda esa información es inútil y la sobrecarga que se añade es desperdiciado. Un simple partido de la operación sería más rápido, más sencillo e igual de efectivo.
    • Me gustaría añadir que la -name parámetro salidas de cadenas, de manera que pierde todas las demás metadatos de archivo (Length, LastWriteTime, etc.). Recomiendo la coincidencia en el Name de la propiedad en lugar de (utilizando -match como mjolinor sugerido).
    • Me gustaría recomendar el uso Fullname, especialmente si usted haciendo un recurse.
    • Sí, si la ruta de acceso de la parte del nombre es importante, por supuesto, estoy de acuerdo.
  3. 2

    Yo uso este:

    (Get-ChildItem -Path $Path | Select -ExpandProperty Fullname) -match <regex> | Remove-Item
    (Get-ChildItem -Path $Path -Recurse | Select -ExpandProperty Fullname) -match <regex> | Remove-Item

    o si tienes V3 o superior de manera que usted tiene de miembros automática de enumeración:

     (Get-ChildItem -Path $Path).Fullname -match <regex> | Remove-Item
     (Get-ChildItem -Path $Path -Recurse).Fullname -match <regex> | Remove-Item

    Nombre es sólo va a funcionar si su directorio de trabajo actual es el directorio en el que está eliminando archivos, y todos los archivos de ese directorio (un recurse puede encontrar más de un archivo con el mismo nombre, pero con diferentes rutas de acceso).

    • Pasar todo el objeto FileInfo (en lugar de una cadena) para Quitar el Elemento de comando eliminará incluso si no está en su ruta actual. La comparación con Nombre evita falsos positivos partidos de simplista patrones de regex accidentalmente la coincidencia de una carpeta principal.
    • Cierto, pero que parece como una muleta para protegerse de sus propias expresiones regulares.
    • Si usted está buscando para que coincida con un patrón en un nombre de archivo/carpeta, entonces realmente no debería haber ninguna necesidad de tener la ruta completa. El OP dice que regex coincidan con un patrón en el nombre de archivo, en referencia a la ruta de acceso completa significa que usted tiene que gastar más tiempo en su expresión regular de patrón y hacer que sea más exacto. Yo no llamaría referencia a Nombre de una muleta tanto como trabajar sólo con lo que se necesita para la tarea deseada.

Dejar respuesta

Please enter your comment!
Please enter your name here