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