ファイル・ディレクトリ操作のコマンド/運用演習

原稿を編集用コピーと提出用コピーに分ける作業です。操作前のディレクトリ構造を描き、各コマンドで何が増減するかを確認します。全パスは自分で作った新しい実習場所の中に限定し、原稿を残すという要件を検証します。

この単元で学ぶこと

  • cpとmvで操作後に残るパスを予測できる
  • 相対パス・空白・先頭ハイフンを安全に扱える
  • 内容とファイルの存在を確認して操作を検証できる

本文解説

作業の前提 元の原稿original.txtの内容をdraftの一行とします。提出用ディレクトリsubmitと、編集用ファイルworking.txtを作り、元の原稿を保持するのが要件です。最初にlesson_dir=$(mktemp -d)で専用場所を作り、以降の名前は全てこの下へ置きます。

初期データを作る printf "draft\n" > "$lesson_dir/original.txt"、mkdir "$lesson_dir/submit"を実行します。test -fで原稿、test -dで提出先の存在を確かめます。これらのtestはファイルの内容が正しいかまでは調べないので、catでdraftの一行も確認します。

編集用コピー cp "$lesson_dir/original.txt" "$lesson_dir/working.txt"を実行します。両方が残り、cmp -sの終了状態0で同一内容を確認できます。通常ファイルの別コピーなので、次にprintf "final\n" > "$lesson_dir/working.txt"で編集用を変更してもoriginal.txtはdraftのままです。ハードリンクを作った場合とは異なります。

提出先へコピー cp "$lesson_dir/working.txt" "$lesson_dir/submit/"はsubmit/working.txtを作ります。既存ディレクトリへ渡しているため、元のファイル名が使われます。この時点ではoriginal.txt、working.txt、submit/working.txtの三つが存在し、内容は順にdraft、final、finalです。

提出物だけ改名 mv "$lesson_dir/submit/working.txt" "$lesson_dir/submit/final.txt"で提出物だけの名前を変えます。submit/working.txtはなくなり、submit/final.txtになります。元のworking.txtは別のコピーなのでこの操作で消えません。提出物がfinalの一行、原稿がdraftの一行であることを確かめます。

隠しファイルを見落とさない 実習先へprintf "note\n" > "$lesson_dir/.memo"で隠しファイルを作った場合、通常のlsでは省かれ、ls -aなら見えます。cp "$lesson_dir"/* "$lesson_dir/submit/"のような広い指定は、隠しファイルを見落とすだけでなくディレクトリ自体も展開対象に入り得ます。今回の三つの既知ファイルは明示した名前で扱います。

存在しない提出先の誤り submitを作らずcp working.txt submitとすると、通常はsubmitというファイルを作り、想定したsubmit/working.txtにはなりません。操作後にtest -d submitとtest -f submit/working.txtの両方を確かめれば、先の型を取り違えたことを発見できます。

完了条件と限定した削除 元draftと提出物finalの内容、三つの期待パス、改名前の提出パスが存在しないことを確認します。削除を練習する場合は新たに作ったdisposable.txtだけをrm --で指定し、他のファイルが残ることを確認します。空でないsubmitへrmdirを試すと失敗するため、その失敗を「提出物が消えた」と取り違えません。

図解

原稿を保持して提出物を作る
コピーと移動を混ぜず、各パスと内容を別々に検証する。

重要ポイント

  • cpは元を残し、mvは元の名前を移す。
  • 最後の引数が既存ディレクトリかどうかで結果が変わる。
  • 空白は引用符、先頭ハイフンは--や./で扱う。
  • 名前の存在・内容・属性を別々に検証する。

間違えやすい点

  • 出力先の名前だけを見てディレクトリだと決め付けない。
  • rmがごみ箱へ移すと思わない。
  • cp成功で全ての属性も同じになると思わない。

用語解説

相対パス
現在の作業位置を基準とするパス。
絶対パス
ルートから位置を表すパス。
再帰コピー
ディレクトリの配下をたどり、含まれる内容もコピーする処理。
オプション終端
--により、後続をオプションとして解釈しないようにする指定。
隠しファイル
Unix系で先頭がドットの名前。通常のlsでは省略される。

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。