Как написать скрипт, который перебирает входные значения? [закрыто]

Empezar de nuevo. Lea esta respuesta completa al menos una vez antes de comenzar y asegúrese de entenderla. Si es necesario, cópielo en un editor y corrija las supuestas referencias a /dev/sdaXy /dev/sdbX. En realidad. Desea hacerlo bien porque tiene una oportunidad muy fácil de romper su instalación existente por completo y por completo. En realidad.

  1. Particionar el SSD.

    • Es posible que necesite una partición de arranque UEFI.
    • Necesitará una partición que tenga al menos el tamaño de su partición /dev/sda5Linux.
    • Es posible que desee una partición de intercambio.
  2. Copie la partición de Linux que desea conservar

    • Arranque desde un disco de rescate
    • ASUMIENDO que el objetivo es /dev/sdb2, ejecutecat /dev/sda5 >/dev/sdb2
    • No te molestes con dd. Usar catno es más lento y suele ser mucho más rápido
  3. Cambiar el tamaño del sistema de archivos de destino para que se ajuste a la partición

    • ASUMIENDO que el objetivo es/dev/sdb2y su tipo de sistema de archivos es ext3o ext4, ejecuteresize2fs /dev/sdb2
  4. Todavía usando el disco de rescate

    • ASUMIENDO que el objetivo es /dev/sdb2, ejecutechroot /dev/sdb2 /bin/bash
    • Ejecute los siguientes comandos, pero tenga en cuenta que sus comandos pueden variar según la distribución

      grub-install /dev/sdb   # Second disk
      update-grub
      
  5. Reinicie y asegúrese de que el nuevo sistema pueda iniciarse

  6. Arregle la partición de intercambio si tiene una

    • ASUMIENDO que su nuevo intercambio es /dev/sdb3, ejecutemkswap /dev/sdb3
    • Edite /etc/fstabpara actualizar (o comentar )la definición de UUID de intercambio
  7. Retire su disco antiguo y reinicie

    • Es posible que deba cambiar los parámetros de arranque de grub temporalmente para hacer referencia a hd0()en lugar de hd1(). Si es así...
    • Ejecute los siguientes comandos, o sus equivalentes,una vez más

      grub-install /dev/sda    # First disk, this time
      update-grub
      
  8. Reiniciar una vez más

    • En esta etapa, debería estar arrancando sin problemas
1
02.03.2018, 17:08
2 ответа

Prueba:

#!/usr/bin/env bash

for f; do 
    mv "$f" ~/trashcan
done
  • el $'sigil es obligatorio para llamar una variable declarada($f)
  • no es necesario for f in "$@"aquí
4
27.01.2020, 23:12

En su código, ha olvidado el $delante de fen el cuerpo del ciclo. Esto también debe citarse correctamente como "$f"para admitir nombres de archivo con espacios, etc. No estoy seguro de que esta sea la causa de su mensaje de error (y no veo nada en el código que pueda causar que aparezca ese error ). El error que esperaría es No such file or directoryal intentar mover un finexistente.


Para una pequeña utilidad como esta, podría convertirla en una función de shell en su archivo ~/.bashrc:

trash () {
    local trashcan="$HOME/trashcan"
    mkdir -p "$trashcan"

    mv -f -v "$@" "$trashcan"
}

Esta función se asegura de que la carpeta de basura realmente exista antes de mover cosas a ella. También realizará el movimiento detalladamente, mostrando los nombres de las cosas que se mueven.

No hay necesidad de iterar aquí ya que "$@"se expandirá correctamente a los nombres dados a la función en la línea de comando.

La única razón que puedo ver para querer iterar sobre los nombres es si quieres asegurarte de que el objetivo del mvno existe antes de realizar el movimiento (para que las cosas en la papelera no funcionen. no se sobrescribe con elementos nuevos ). Con mvde GNU coreutils, puede hacerlo automáticamente con algo como

mv -f -v --backup=numbered "$@" "$trashcan"

Con no -GNU mv, es posible que desee ese bucle (que reemplaza el mven la función de shell anterior):

local trash_ext="$RANDOM"

for name; do
    while [ -e "$trashcan/${name##*/}.$trash_ext" ]; do
        trash_ext="$RANDOM"
    done

    mv -f -v "$name" "$trashcan/${name##*/}.$trash_ext"
done

Esta es solo una forma rápida -y -sucia de crear un nombre único agregando un número aleatorio después del nombre del archivo. La cosa ${name##*/}se expandirá al nombre base (, la parte del nombre de archivo de la ruta )de $namey podría ser reemplazada por $( basename "$name" ).

3
27.01.2020, 23:12

Теги

Похожие вопросы