反対の操作でスクリプトを生成する方法

反対の操作でスクリプトを生成する方法

ソートされていないフォルダのさまざまなファイル形式を新しく作成されたディレクトリにソートして処理する対話型スクリプトがあります。

必要に応じて、実行されたスクリプトとそのソートプロセスを再度フォルダ(事前ソート)状態に展開/元に戻すことができるように、小さなスクリプトを作成するか、既存のスクリプトを変更する方法を知りたいです。

これを達成する最も効率的な方法は何ですか?

#!/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

答え1

以下は(成功した)コマンドの後に呼び出すことができる関数でmv、と同じ引数を提供し、mv関数はファイルを元の場所に戻す必要がある対応するコマンドをエコーし​​ます。また、これらのコマンドを代替ファイルにリダイレクトすることもできます。また、安全予防措置として注釈を付けます。

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
}

この機能は、データ損失の状況(初期のmvコマンドによって誤ってファイルが破損したり、後でファイルが移動または削除された)から回復することはできませんが、デフォルトでは機能するはずです。

重要な警告

シェルコマンドをシェルに再引用するのは難しいので、ファイル名を一重引用符で囲みました。これは、結果コマンドのコピー/貼り付けが機能しないことを意味します。もしこのコマンドのすべてのファイル名には単一引用符が含まれています。

実行例は次のとおりです。

$ 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'

スクリプトの場合は、mv次のようにそれぞれの後に別の行を追加できます。

...
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

関連情報