Como faço para gerar um script com uma ação inversa

2

Eu tenho um script interativo que classifica e processa uma variedade de tipos de arquivos de uma pasta não classificada em diretórios recém-criados.

Eu queria saber como eu poderia escrever um script pequeno ou modificar o script existente para que eu pudesse desfazer / desfazer o script executado e seu processo de classificação de volta ao estado de pastas (pre sort), se necessário.

Qual é a maneira mais simples de conseguir isso?

#!/bin/bash
read -p "Good Morning, Please enter your file type name for sorting [ENTER]:" all_extensions
if cd /Users/christopherdorman/desktop
  then  while read extension
      do    destination="folder$extension"
        mkdir -p "$destination"
        mv  -v unsorted/*."$extension" "$destination"
      done   <<< "${all_extensions// /$'\n'}"
        mkdir -p foldermisc 
        if mv  -v unsorted/* "foldermisc"
      then  echo "Good News, the rest of Your files have been successfully processed"
        fi
    for i in folder*/; do
        ls -S "$i" > "${i}filelist" 
        cat "${i}filelist" >> ~/desktop/summary.txt
    done
fi
    
por Syntax Killer 30.11.2016 / 15:33

1 resposta

2

Abaixo está uma função que você poderia chamar após os comandos (com êxito) mv , dando os mesmos parâmetros que você usou para mv , e a função ecoará os comandos correspondentes que devem colocar os arquivos de volta onde eles estavam. Você poderia alternativamente redirecionar esses comandos para um arquivo de backout; eles também são comentados, apenas como uma precaução de segurança.

function mvbackout {
  declare -a files
  for f
  do
    files+=("$f")
  done
  # remove the last parameter (the destination)
  unset files[$(( $# - 1 ))]
  dest=$f
  printf "# cd -- %s\n" "$PWD"
  for f in "${files[@]}"
  do
    printf "# mv -- '%s' '%s'\n" "${dest}/$(basename "$f")" "$f"
  done
}

A função (não pode) se recuperar de cenários de perda de dados (onde o comando mv inicial espancou um arquivo por acidente; ou um arquivo foi posteriormente movido ou removido), mas para a idéia principal, ele deve funcionar. p>

Advertência importante

Como re-citar comandos shell de volta para o shell é complicado, eu coloquei os nomes dos arquivos entre aspas simples, o que significa que copiar / colar o comando resultante não funcionará se nenhum dos nomes de arquivos nesse comando contém aspas simples.

Aqui está uma amostra de execução:

$ mkdir dest
$ touch a b
$ mkdir -p subdir1/subdir2/subdir3 mkdir fun\'d\'ir fun\'d\'ir/fun\"d\"ir
$ touch subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e 
$ mv a b subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e dest
$ mvbackout a b subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e dest
# cd -- /home/schaller/tmp/dir
# mv -- 'dest/a' 'a'
# mv -- 'dest/b' 'b'
# mv -- 'dest/c' 'subdir1/c'
# mv -- 'dest/d' 'subdir1/subdir2/d'
# mv -- 'dest/e' 'subdir1/subdir2/subdir3/e'

Para o seu script, você pode adicionar outra linha após cada mv , assim:

...
mv  -v unsorted/*."$extension" "$destination"
mvbackout unsorted/*."$extension" "$destination"
... 
if mv  -v unsorted/* "foldermisc"
then
   mvbackout unsorted/* "foldermisc" 
   echo "Good News, the rest of Your files have been successfully processed"
fi
    
por 01.12.2016 / 04:43