ファイルとディレクトリの操作

最終更新日:2024-11-22 | ページの編集

概要

質問

  • ファイルやディレクトリをどのように作成、コピー、削除できますか?
  • ファイルをどのように編集できますか?

目的

  • 指定された図に一致するディレクトリ階層を作成する。
  • エディターを使用して、または既存のファイルをコピーおよびリネームして、その階層内にファイルを作成する。
  • 指定されたファイルやディレクトリを削除、コピー、移動する。

ディレクトリの作成


これまでにファイルやディレクトリを探索する方法を学びましたが、 それらを最初に作成する方法はどうすれば良いでしょうか?

このセクションでは、exercise-data/writingディレクトリを例として使用して、 ファイルやディレクトリを作成および移動する方法を学びます。

ステップ1: 現在の場所と既存の内容を確認する

まだDesktop上のshell-lesson-dataディレクトリ内にいるはずです。 これを確認するには以下を使用します:

BASH

$ pwd

出力

/Users/nelle/Desktop/shell-lesson-data

次に、exercise-data/writingディレクトリに移動してその内容を確認します:

BASH

$ cd exercise-data/writing/
$ ls -F

出力

haiku.txt  LittleWomen.txt

ディレクトリを作成する

mkdir thesisコマンドを使用して、thesisという名前の新しいディレクトリを作成します (このコマンドは出力を生成しません)。

BASH

$ mkdir thesis

名前から想像できるように、 mkdirは「ディレクトリを作成する」(make directory)を意味します。 thesisは相対パスであるため (つまり、/what/ever/thesisのようにスラッシュが先頭についていない)、 新しいディレクトリは現在の作業ディレクトリに作成されます:

BASH

$ ls -F

出力

haiku.txt  LittleWomen.txt  thesis/

thesisディレクトリを作成したばかりなので、中にはまだ何もありません:

BASH

$ ls -F thesis

mkdirは1回で単一のディレクトリを作成するだけではありません。 -pオプションを使用すると、ネストされたサブディレクトリを 1回の操作で作成することができます:

BASH

$ mkdir -p ../project/data ../project/results

lsコマンドの-Rオプションは、ディレクトリ内のすべてのネストされたサブディレクトリをリストします。 先ほど作成したprojectディレクトリの新しいディレクトリ階層を再帰的にリストしてみましょう:

BASH

$ ls -FR ../project

出力

../project/:
data/  results/

../project/data:

../project/results:

同じことを行う2つの方法

シェルを使用してディレクトリを作成することは、 ファイルエクスプローラーを使用することと何ら変わりありません。 オペレーティングシステムのグラフィカルファイルエクスプローラーで現在のディレクトリを開くと、 thesisディレクトリがそこにも表示されます。 シェルとファイルエクスプローラーはファイルを操作するための2つの異なる方法ですが、 ファイルやディレクトリ自体は同じものです。

ファイルやディレクトリの良い名前付け

複雑な名前のファイルやディレクトリは、 コマンドラインで作業する際に苦労の原因になります。 ここでは、ファイルやディレクトリ名に関するいくつかの有用なヒントを紹介します。

  1. スペースを使用しない。

スペースは名前をより意味のあるものにしますが、 スペースはコマンドラインで引数を区切るために使用されるため、 ファイルやディレクトリ名にスペースを使用しない方が良いです。 代わりに-_を使用できます(例:north-pacific-gyre/の代わりにnorth pacific gyre/)。 これを試してみるには、mkdir north pacific gyreを入力して、 ls -Fで作成されたディレクトリを確認してください。

  1. 名前を-(ダッシュ)で始めない。

コマンドは、-で始まる名前をオプションとして処理します。

  1. 文字、数字、.(ピリオド)、-(ダッシュ)、および_(アンダースコア)を使用する。

その他の多くの文字にはコマンドラインで特別な意味があります。 これについては、このレッスンで学びます。 特定の特殊文字を使用すると、コマンドが期待通りに動作しなかったり、 データ損失を引き起こす可能性があります。

スペースやその他の特殊文字を含むファイルやディレクトリの名前を参照する必要がある場合は、 その名前をシングルクオート(')で囲む必要があります。 詳細はGNUのクオートに関するドキュメントを参照してください。

テキストファイルを作成する

cdを使用して作業ディレクトリをthesisに変更し、 nanoというテキストエディタを実行してdraft.txtというファイルを作成しましょう:

BASH

$ cd thesis
$ nano draft.txt

どのエディタを使うべき?

ここで「nanoはテキストエディタです」と言うとき、私たちは本当に「テキスト」を意味します。 それはプレーンな文字データのみを扱うことができ、 表や画像、その他の人間に優しいメディアは扱えません。 私たちはそのシンプルさゆえに例として使用しますが、 そのために十分な機能や柔軟性を欠く可能性があります。 Unixシステム(LinuxやmacOSなど)では、 多くのプログラマーがEmacsVim(どちらも学習に時間が必要)、 またはgeditVScodeなどのグラフィカルエディタを使用します。 Windowsでは、Notepad++を使用することをお勧めします。 Windowsにはnotepadという組み込みのエディタもあり、このレッスンの目的ではnanoと同様にコマンドラインから実行できます。

どのエディタを使用する場合でも、 それがファイルを検索し保存する場所を知る必要があります。 シェルからエディタを起動すると、 おそらく現在の作業ディレクトリをデフォルトの保存場所として使用します。 コンピュータのスタートメニューを使用する場合は、 デスクトップやドキュメントディレクトリに保存するように求められるかもしれません。 これは、初めて「名前を付けて保存」するときに別のディレクトリに移動することで変更

できます。

Let’s type in a few lines of text.

nanoテキストエディタの動作中のスクリーンショット。テキストは「It's not publish or perish any more, it's share and thrive」

テキストに満足したら、Ctrl+OCtrlまたはControlキーを押しながらOキーを押す)を押して、 データをディスクに書き込みます。テキストを含むファイルの名前を指定するよう求められます。 デフォルトで提案されたdraft.txtを受け入れるには、Returnを押してください。

ファイルが保存されたら、Ctrl+Xを押してエディタを終了し、 シェルに戻ります。

Control、Ctrl、または^キー

Controlキーは「Ctrl」キーとも呼ばれます。 Controlキーを使用する方法にはさまざまな記述があります。 たとえば、Controlキーを押しながらXキーを押す指示は以下のように記述されることがあります:

  • Control-X
  • Control+X
  • Ctrl-X
  • Ctrl+X
  • ^X
  • C-x

nanoでは、画面の下部に^G Get Help ^O WriteOutと表示されます。 これは、Control-Gでヘルプを表示し、Control-Oでファイルを保存できることを意味します。

nanoは終了後に画面に何も出力しませんが、 lsを実行するとdraft.txtというファイルが作成されたことがわかります:

BASH

$ ls

出力

draft.txt

別の方法でファイルを作成する

nanoエディタを使用してテキストファイルを作成する方法を見ました。 次に、以下のコマンドを試してください:

BASH

$ touch my_file.txt
  1. touchコマンドは何をしますか? 現在のディレクトリをGUIファイルエクスプローラーで見ると、ファイルが表示されますか?

  2. ls -lを使用してファイルを調べます。my_file.txtのサイズはどれくらいですか?

  3. どのような場合にこの方法でファイルを作成したいと思いますか?

  1. touchコマンドは、現在のディレクトリにmy_file.txtという新しいファイルを生成します。 コマンドラインプロンプトでlsを入力すると、この新しく生成されたファイルを確認できます。 また、GUIファイルエクスプローラーでもmy_file.txtを見ることができます。

  2. ls -lでファイルを調べると、my_file.txtのサイズは0バイトであることがわかります。 つまり、データが含まれていません。テキストエディタでmy_file.txtを開くと空白です。

  3. 一部のプログラムは、出力ファイルを自分で生成するのではなく、 空のファイルが既に生成されていることを要求します。 プログラムが実行されると、既存のファイルを検索し、そこに出力を記録します。 touchコマンドを使用すると、このようなプログラム用に空のテキストファイルを効率的に生成できます。

別の方法でファイルを作成する (continued)

混乱を避けるために、作成したファイルをこのエピソードの残りを進める前に削除することをお勧めします。 そうしないと、将来の出力がレッスンで示されているものと異なる場合があります。 削除するには、次のコマンドを使用します:

BASH

$ rm my_file.txt

名前に何が含まれているのか?

Nelleのすべてのファイルが「何か.何か」という形式の名前であることに気づいたかもしれません。 このレッスンでは常に拡張子.txtを使用しました。 これは単なる慣例ですが、ファイルをmythesisやその他ほとんど任意の名前で呼ぶこともできます。 しかし、ほとんどの人は異なる種類のファイルを区別するために、2部構成の名前を使います。 その名前の後半部分はファイル拡張子と呼ばれ、ファイルが保持するデータの種類を示します: たとえば、.txtはプレーンテキストファイル、.pdfはPDFドキュメント、 .cfgはプログラムのパラメータを含む設定ファイル、.pngはPNG画像などです。

これは重要な慣例に過ぎません。ファイルには単にバイトが含まれるだけで、 そのバイトをプレーンテキストファイル、PDFドキュメント、設定ファイル、画像などのルールに従って解釈するのは私たちとプログラム次第です。

例えば、クジラのPNG画像をwhale.mp3と名付けても、 それがクジラの歌の録音になるわけではありません。 ただし、オペレーティングシステムがそのファイルを音楽プレーヤーに関連付ける場合があります。 この場合、ファイルエクスプローラーでwhale.mp3をダブルクリックすると、 音楽プレーヤーが自動的に(そして誤って)そのファイルを開こうとします。

ファイルとディレクトリを移動する


shell-lesson-data/exercise-data/writingディレクトリに戻ります:

BASH

$ cd ~/Desktop/shell-lesson-data/exercise-data/writing

thesisディレクトリにはdraft.txtというファイルがありますが、 これは特に情報量の多い名前ではありません。 そこで、mvを使用してファイル名を変更しましょう。 mvは「move」の略です:

BASH

$ mv thesis/draft.txt thesis/quotes.txt

最初の引数は「移動するもの」、2番目の引数は「移動先」を指定します。 この場合、 thesis/draft.txtthesis/quotes.txtに移動しています。 これにより、ファイル名を変更するのと同じ効果が得られます。 lsを実行すると、 thesisにはquotes.txtという1つのファイルが含まれていることがわかります:

BASH

$ ls thesis

出力

quotes.txt

ターゲットファイル名を指定する際は注意が必要です。 mvは既存のファイルを上書きする場合、警告なしに実行されるため、データ損失につながる可能性があります。 ただし、mv -i(またはmv --interactive)オプションを使用すると、 上書きする前に確認を求めるようになります。

なお、mvはディレクトリにも使用できます。

次に、quotes.txtを現在の作業ディレクトリに移動します。 再びmvを使用しますが、 今回は2番目の引数としてディレクトリ名だけを使用し、 ファイル名を保持しつつ別の場所に移動させることを指定します。 (これが「move」と呼ばれる理由です。) この場合、 使用するディレクトリ名は、前述の特殊なディレクトリ名.です。

BASH

$ mv thesis/quotes.txt .

この操作により、ファイルは元のディレクトリから現在の作業ディレクトリに移動されます。 lsを実行すると、thesisが空であることがわかります:

BASH

$ ls thesis

出力

$

または、quotes.txtthesisディレクトリに存在しないことを 明示的にリストして確認することもできます:

BASH

$ ls thesis/quotes.txt

エラー

ls: cannot access 'thesis/quotes.txt': No such file or directory

lsにファイル名やディレクトリを引数として指定すると、その指定された

ファイルやディレクトリだけをリストします。 引数として指定したファイルが存在しない場合、 シェルは上記のようにエラーを返します。 これにより、現在のディレクトリにquotes.txtが存在することを確認できます:

BASH

$ ls quotes.txt

出力

quotes.txt

ファイルを新しいフォルダに移動する

以下のコマンドを実行した後、 Jamieはファイルsucrose.datmaltose.datを間違ったフォルダに入れてしまったことに気付きます。 これらのファイルはrawフォルダに置くべきでした。

BASH

$ ls -F
 analyzed/ raw/
$ ls -F analyzed
fructose.dat glucose.dat maltose.dat sucrose.dat
$ cd analyzed

以下の空欄を埋めて、これらのファイルをraw/フォルダに移動してください (つまり、置き忘れたフォルダに移動します)。

BASH

$ mv sucrose.dat maltose.dat ____/____

BASH

$ mv sucrose.dat maltose.dat ../raw

..は親ディレクトリ(現在のディレクトリの1つ上)を指し、 .は現在のディレクトリを指します。

ファイルとディレクトリをコピーする


cpコマンドはmvと非常によく似ていますが、 ファイルを移動するのではなくコピーします。 正しく動作したことを確認するには、 lsを2つのパスを引数として使用します。 ほとんどのUnixコマンドと同様に、lsには複数のパスを指定できます:

BASH

$ cp quotes.txt thesis/quotations.txt
$ ls quotes.txt thesis/quotations.txt

出力

quotes.txt   thesis/quotations.txt

ディレクトリとそのすべての内容をコピーするには、 再帰的なオプション-rを使用できます。 例えば、ディレクトリをバックアップするには:

BASH

$ cp -r thesis thesis_backup

結果を確認するために、thesisディレクトリとthesis_backupディレクトリの内容をリストします:

BASH

$ ls thesis thesis_backup

出力

thesis:
quotations.txt

thesis_backup:
quotations.txt

ディレクトリをコピーする場合、-rフラグを含めることが重要です。 このオプションを省略すると、ディレクトリが省略されたというメッセージが表示されます:

BASH

$ cp thesis thesis_backup
cp: -r not specified; omitting directory 'thesis'

ファイルのリネーム

現在のディレクトリにデータを分析するために必要な統計テストのリストを含むプレーンテキストファイルを作成し、 statstics.txtという名前を付けたと仮定します。

ファイルを作成して保存した後で、名前のスペルミスに気付いた場合、 このミスを修正するには以下のコマンドのどれを使用できますか?

  1. cp statstics.txt statistics.txt
  2. mv statstics.txt statistics.txt
  3. mv statstics.txt .
  4. cp statstics.txt .
  1. いいえ。これにより正しい名前のファイルが作成されますが、 間違った名前のファイルがディレクトリ内に残り、それを削除する必要があります。
  2. はい。このコマンドを使用するとファイル名を変更できます。
  3. いいえ。ピリオド(.)はファイルの移動先を示しますが、新しいファイル名を提供しません。 同じ名前のファイルは作成できません。
  4. いいえ。ピリオド(.)はファイルのコピー先を示しますが、新しいファイル名を提供しません。 同じ名前のファイルは作成できません。

ファイルの移動とコピー

以下のコマンドシーケンスで、最後のlsコマンドの出力はどうなりますか?

BASH

$ pwd

出力

/Users/jamie/data

BASH

$ ls

出力

proteins.dat

BASH

$ mkdir recombined
$ mv proteins.dat recombined/
$ cp recombined/proteins.dat ../proteins-saved.dat
$ ls
  1. proteins-saved.dat recombined
  2. recombined
  3. proteins.dat recombined
  4. proteins-saved.dat

最初に/Users/jamie/dataディレクトリにいて、新しいフォルダrecombinedを作成します。 次の行で、mvコマンドを使用してproteins.datファイルを新しいフォルダrecombinedに移動します。 その後、移動したファイルをコピーします。 ここでのポイントは、ファイルがどこにコピーされたかです。 ..は「1レベル上に移動」を意味するため、コピーされたファイルは/Users/jamieにあります。 注意すべき点は、..が現在の作業ディレクトリに基づいて解釈されることであり、 コピー元のファイルの場所には基づいていないということです。 したがって、ls/Users/jamie/data内で実行)で表示されるのはrecombinedフォルダだけです。

  1. いいえ。説明の通り、proteins-saved.dat/Users/jamieにあります。
  2. はい。
  3. いいえ。説明の通り、proteins.dat/Users/jamie/data/recombinedにあります。
  4. いいえ。説明の通り、proteins-saved.dat/Users/jamieにあります。

ファイルとディレクトリの削除


shell-lesson-data/exercise-data/writingディレクトリに戻り、 作成したquotes.txtファイルを削除して、このディレクトリを整理しましょう。 このために使用するUnixコマンドはrm(「remove」の略)です:

BASH

$ rm quotes.txt

ファイルが削除されたことを確認するには、lsを使用します:

BASH

$ ls quotes.txt

エラー

ls: cannot access 'quotes.txt': No such file or directory

削除は永久的です

Unixシェルには削除したファイルを回復するためのゴミ箱がありません (ただし、ほとんどのUnix向けグラフィカルインターフェースにはゴミ箱があります)。 代わりに、ファイルを削除すると、それらはファイルシステムからリンクが解除され、 ディスク上のストレージ領域が再利用できるようになります。 削除されたファイルを見つけて回復するためのツールは存在しますが、 特定の状況で動作する保証はありません。 削除されたファイルのディスクスペースがすぐに再利用される可能性があるためです。

rmを安全に使用する

rm -i thesis_backup/quotations.txtを実行するとどうなりますか? rmを使用する際に、この保護が必要な理由は何ですか?

出力

rm: remove regular file 'thesis_backup/quotations.txt'? y

-iオプションは、削除前に確認を求めます(Yで削除を確認、 Nでファイルを保持します)。 Unixシェルにはゴミ箱がないため、一度削除されたファイルは永久に消えます。 -iオプションを使用することで、 削除するのが本当に必要なファイルだけであることを確認する機会が得られます。

rmコマンドを使用してthesisディレクトリを削除しようとすると、エラーメッセージが表示されます:

BASH

$ rm thesis

エラー

rm: cannot remove 'thesis': Is a directory

これは、rmがデフォルトではファイルに対してのみ動作し、ディレクトリには動作しないためです。

rmコマンドは、再帰オプション-rを使用することで ディレクトリとその内容をすべて削除できますが、 確認のプロンプトは表示されません

BASH

$ rm -r thesis

シェルを使用して削除されたファイルは回復できないため、 rm -r慎重に使用する必要があります。 インタラクティブなオプションrm -r -iを追加することを検討してください。

複数のファイルやディレクトリの操作


複数のファイルを一度にコピーまたは移動する必要がある場合があります。 これは、個別のファイル名のリストを指定するか、 ワイルドカードを使用して命名パターンを指定することで実行できます。 ワイルドカードは、Unixファイルシステムをナビゲートするときに 不明な文字や文字のセットを表すために使用される特殊な文字です。

複数のファイルをコピーする

この演習では、shell-lesson-data/exercise-dataディレクトリ内でコマンドをテストできます。

以下の例では、複数のファイル名とディレクトリ名が指定された場合、 cpは何を行いますか?

BASH

$ mkdir backup
$ cp creatures/minotaur.dat creatures/unicorn.dat backup/

以下の例では、3つ以上のファイル名が指定された場合、cpは何を行いますか?

BASH

$ cd creatures
$ ls -F

出力

basilisk.dat  minotaur.dat  unicorn.dat

BASH

$ cp minotaur.dat unicorn.dat basilisk.dat

複数のファイル名に続いてディレクトリ名が指定された場合 (つまり、宛先ディレクトリは最後の引数でなければなりません)、 cpはファイルを指定されたディレクトリにコピーします。

3つ以上のファイル名が指定された場合、cpは以下のようなエラーを出します。 これは、cpが最後の引数をディレクトリ名として期待しているためです。

エラー

cp: target 'basilisk.dat' is not a directory

ワイルドカードを使用して複数のファイルにアクセスする

ワイルドカード

*ワイルドカードで、0個以上の他の文字を表します。 shell-lesson-data/exercise-data/alkanesディレクトリを考えてみましょう: *.pdbethane.pdbpropane.pdb、および’.pdb’で終わるすべてのファイルを表します。 一方、p*.pdbpentane.pdbpropane.pdbのみを表します。 これは、先頭の’p’がファイル名の最初の文字’p’で始まるものだけを表すためです。

?もワイルドカードですが、これは正確に1文字を表します。 したがって、?ethane.pdbmethane.pdbを表す可能性があり、 *ethane.pdbethane.pdbmethane.pdbの両方を表します。

ワイルドカードは互いに組み合わせて使用できます。たとえば、 ???ane.pdbは3文字に続いてane.pdbを示し、 cubane.pdbethane.pdboctane.pdbを表します。

シェルがワイルドカードを見ると、それを展開して一致するファイル名のリストを作成し、 コマンドを実行する前に処理します。 例外として、ワイルドカード式が一致するファイルを見つけられなかった場合、 Bashはその式をコマンドにそのまま引数として渡します。 たとえば、alkanesディレクトリでls *.pdfを入力すると、 (.pdbで終わるファイルしか含まれていない場合) *.pdfというファイルが存在しないというエラーメッセージが表示されます。 一般的に、wclsなどのコマンドは、これらの式に一致するファイル名のリストを処理しますが、 ワイルドカード自体は処理しません。 ワイルドカードを展開するのはシェルであり、他のプログラムではありません。

パターンに一致するファイル名をリストする

alkanesディレクトリで実行すると、どのlsコマンドが次の出力を生成しますか?

ethane.pdb methane.pdb

  1. ls *t*ane.pdb
  2. ls *t?ne.*
  3. ls *t??ne.pdb
  4. ls ethane.*

解答は3.です。

1.は、ゼロ個以上の文字(*)に続いてt、 さらにゼロ個以上の文字(*)に続いてane.pdbを含むすべてのファイルを表示します。 これにはethane.pdbmethane.pdboctane.pdbpentane.pdbが含まれます。

2.は、ゼロ個以上の文字(*)に続いてt、 次に1文字(?)、ne.に続いてゼロ個以上の文字(*)を含むすべてのファイルを表示します。 これによりoctane.pdbpentane.pdbが表示されますが、thane.pdbで終わるものは一致しません。

3.は、tneの間に2文字(??)を含むものを一致させることで、2.の問題を修正します。 これが正解です。

4.ethane.で始まるファイルのみを表示します。

ワイルドカードについてもっと学ぶ

Samは、キャリブレーションデータ、データセット、およびデータセットの説明を含むディレクトリを持っています:

BASH

.
├── 2015-10-23-calibration.txt
├── 2015-10-23-dataset1.txt
├── 2015-10-23-dataset2.txt
├── 2015-10-23-dataset_overview.txt
├── 2015-10-26-calibration.txt
├── 2015-10-26-dataset1.txt
├── 2015-10-26-dataset2.txt
├── 2015-10-26-dataset_overview.txt
├── 2015-11-23-calibration.txt
├── 2015-11-23-dataset1.txt
├── 2015-11-23-dataset2.txt
├── 2015-11-23-dataset_overview.txt
├── backup
│   ├── calibration
│   └── datasets
└── send_to_bob
    ├── all_datasets_created_on_a_23rd
    └── all_november_files

次のフィールド作業に出発する前に、Samはデータをバックアップし、 いくつかのデータセットを同僚のBobに送信したいと考えています。 彼女は以下のコマンドを使用して作業を完了します:

BASH

$ cp *dataset* backup/datasets
$ cp ____calibration____ backup/calibration
$ cp 2015-____-____ send_to_bob/all_november_files/
$ cp ____ send_to_bob/all_datasets_created_on_a_23rd/

空欄を埋めて、Samを手助けしてください。

最終的なディレクトリ構造は以下のようになります:

BASH

.
├── 2015-10-23-calibration.txt
├── 2015-10-23-dataset1.txt
├── 2015-10-23-dataset2.txt
├── 2015-10-23-dataset_overview.txt
├── 2015-10-26-calibration.txt
├── 2015-10-26-dataset1.txt
├── 2015-10-26-dataset2.txt
├── 2015-10-26-dataset_overview.txt
├── 2015-11-23-calibration.txt
├── 2015-11-23-dataset1.txt
├── 2015-11-23-dataset2.txt
├── 2015-11-23-dataset_overview.txt
├── backup
│   ├── calibration
│   │   ├── 2015-10-23-calibration.txt
│   │   ├── 2015-10-26-calibration.txt
│   │   └── 2015-11-23-calibration.txt
│   └── datasets
│       ├── 2015-10-23-dataset1.txt
│       ├── 2015-10-23-dataset2.txt
│       ├── 2015-10-23-dataset_overview.txt
│       ├── 2015-10-26-dataset1.txt
│       ├── 2015-10-26-dataset2.txt
│       ├── 2015-10-26-dataset_overview.txt
│       ├── 2015-11-23-dataset1.txt
│       ├── 2015-11-23-dataset2.txt
│       └── 2015-11-23-dataset_overview.txt
└── send_to_bob
    ├── all_datasets_created_on_a_23rd
    │   ├── 2015-10-23-dataset1.txt
    │   ├── 2015-10-23-dataset2.txt
    │   ├── 2015-10-23-dataset_overview.txt
    │   ├── 2015-11-23-dataset1.txt
    │   ├── 2015-11-23-dataset2.txt
    │   └── 2015-11-23-dataset_overview.txt
    └── all_november_files
        ├── 2015-11-23-calibration.txt
        ├── 2015-11-23-dataset1.txt
        ├── 2015-11-23-dataset2.txt
        └── 2015-11-23-dataset_overview.txt

BASH

$ cp *calibration.txt backup/calibration
$ cp 2015-11-* send_to_bob/all_november_files/
$ cp *-23-dataset* send_to_bob/all_datasets_created_on_a_23rd/

ディレクトリとファイルの整理

Jamieはプロジェクトに取り組んでいますが、ファイルがあまり整理されていないことに気づきました:

BASH

$ ls -F

出力

analyzed/  fructose.dat    raw/   sucrose.dat

fructose.datsucrose.datのファイルはデータ解析の出力を含んでいます。 以下のコマンドが示す出力を得るために、Jamieはどのコマンドを実行する必要がありますか?

BASH

$ ls -F

出力

analyzed/   raw/

BASH

$ ls analyzed

出力

fructose.dat    sucrose.dat

BASH

mv *.dat analyzed

Jamieは、fructose.datsucrose.datファイルをanalyzedディレクトリに移動する必要があります。 シェルは*.datを展開して現在のディレクトリ内のすべての.datファイルに一致させます。 その後、mvコマンドでこれらの.datファイルをanalyzedディレクトリに移動します。

フォルダ構造を再現する

新しい実験を開始するにあたり、以前の実験のディレクトリ構造を複製して、 新しいデータを追加できるようにしたいと考えています。

以前の実験は2016-05-18というフォルダにあり、この中にはdataフォルダが含まれています。 さらに、このフォルダにはrawprocessedという名前のフォルダが含まれ、それぞれデータファイルを持っています。 目標は、2016-05-18フォルダのフォルダ構造を2016-05-20フォルダにコピーして、 最終的なディレクトリ構造を以下のようにすることです:

出力

2016-05-20/
└── data
   ├── processed
   └── raw

以下のどのコマンドセットがこの目標を達成しますか? 他のコマンドセットは何をするでしょうか?

BASH

$ mkdir 2016-05-20
$ mkdir 2016-05-20/data
$ mkdir 2016-05-20/data/processed
$ mkdir 2016-05-20/data/raw

BASH

$ mkdir 2016-05-20
$ cd 2016-05-20
$ mkdir data
$ cd data
$ mkdir raw processed

BASH

$ mkdir 2016-05-20/data/raw
$ mkdir 2016-05-20/data/processed

BASH

$ mkdir -p 2016-05-20/data/raw
$ mkdir -p 2016-05-20/data/processed

BASH

$ mkdir 2016-05-20
$ cd 2016-05-20
$ mkdir data
$ mkdir raw processed

最初の2つのコマンドセットは、この目標を達成します。 最初のセットは、トップレベルのディレクトリを作成してからサブディレクトリを作成します。

3番目のコマンドセットはエラーになります。 mkdirのデフォルトの動作では、存在しないディレクトリのサブディレクトリを作成できないためです。 中間レベルのフォルダを最初に作成する必要があります。

4番目のコマンドセットは、この目標を達成します。 -pオプションを使用すると、必要に応じて中間のサブディレクトリも

作成できます。

最後のコマンドセットでは、rawprocessedディレクトリがdataディレクトリと同じレベルに作成されます。

まとめ

  • cp [old] [new]はファイルをコピーします。
  • mkdir [path]は新しいディレクトリを作成します。
  • mv [old] [new]はファイルまたはディレクトリを移動(リネーム)します。
  • rm [path]はファイルを削除します。
  • *はファイル名内で0文字以上の任意の文字に一致します。例えば、*.txt.txtで終わるすべてのファイルに一致します。
  • ?はファイル名内で任意の1文字に一致します。例えば、?.txta.txtに一致しますが、any.txtには一致しません。
  • Controlキーの使用法はCtrl-XControl-X^Xなどさまざまな方法で表現されることがあります。
  • シェルにはゴミ箱がありません。一度削除すると、完全に消えます。
  • ほとんどのファイル名はsomething.extensionの形式です。拡張子は必須ではありませんが、通常ファイル内のデータの種類を示します。
  • 作業内容によっては、Nanoよりも強力なテキストエディタが必要になる場合があります。