
だから私は次にフォーマットされたフォルダをたくさん持っており .../course/year/...
、フォーマットが次に変わるように頻繁に再構成します.../year/course/...
。私はいつもシェルスクリプトを書く方法を学びたかったのですが、オートメーションとシェルスクリプトも初めてですが、私が好きなフォルダへのパスを入力したときに知っているスクリプトを作成したかったのです。名前を変更します。たとえば、次のコマンドがあります。sh reorganize.sh .../course/year/...
これは、コースフォルダと年フォルダを「交換」します。年フォルダ内にいくつかのコンテンツがあります。交換した後は、年フォルダのすべての内容がコースフォルダにあるはずです。複数の年のフォルダもあるため、2018、2019、2020はすべてコースフォルダ内に独自のフォルダがあります。これを行う方法についてご協力いただきありがとうございます。
PS - 私がかなり初心者であることは、私が変数、パイプ、基本コマンドの基本を知っていますが、それ以上ではないという意味です。
答え1
#! /bin/bash
rootdir="$PWD"
shopt -s nullglob
for course in *; do
pushd "$course" >/dev/null
for year in *; do
mkdir -p "${rootdir}/${year}"
mv --no-target-directory "$year" "${rootdir}/${year}/${course}"
done
popd >/dev/null
rmdir "$course"
done
rootdir="$PWD"
ディレクトリ間を移動するときに絶対パス()とpushd
/を代わりに使用するpopd
とエラーが少なくなると思いますcd
。この単純なケースではこれは必要ありません。
mv --no-target-directory
これにより、スクリプトが複数回実行される(以前の実行が中断された場合)、意図しない結果が発生するのを防ぐことができます。同様に、この場合(ファイルシステム内で移動)、危険な状況は発生しないと主張することができます。mv
動作は、ターゲットディレクトリ/新しいパスが存在するかどうかによって異なります。このオプションを使用すると、これは発生しません。