Linux のワイルドカードを使用した特定のパターンを持つファイルのコピー方法

LinuxLinuxBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Linux のワイルドカード(globbing パターンとも呼ばれます)は、シェルでファイル名をマッチングし展開するために使用される特殊文字です。これらの強力なツールを使いこなすことで、Linux コマンドラインでの作業効率を大幅に向上させることができます。このチュートリアルでは、Linux のワイルドカードの基本を解説し、特定のパターンを持つファイルをコピーする方法を説明します。これにより、ファイル管理タスクを効率化できます。

基本的なワイルドカードの理解

Linux では、ワイルドカードはパターンを使用して複数のファイルにマッチングするのに役立つ特殊文字です。一度に多くのファイルを管理する必要がある場合に特に役立ちます。現在のディレクトリにあるファイルを調べて、最も一般的なワイルドカードを見てみましょう。

まず、作業対象となるすべてのファイルを確認しましょう。

cd ~/project/wildcards_lab
ls

次のようなさまざまな拡張子を持つファイルのリストが表示されるはずです。

backup        data_02.csv  doc2.pdf     file3.txt    image3.jpg      readme.md
config.yml    data_03.csv  documents    images       report1.txt     report_final.txt
data_01.csv   doc1.pdf     file1.txt    image1.jpg   report2.txt     script.sh
file2.txt     image2.jpg

アスタリスク (*) ワイルドカード

アスタリスク * は最も一般的なワイルドカードです。任意の数の文字(ゼロを含む)にマッチングします。実際に見てみましょう。

すべてのテキストファイル(.txt で終わるファイル)をリスト表示するには:

ls *.txt

次のように表示されるはずです。

file1.txt  file2.txt  file3.txt  report1.txt  report2.txt  report_final.txt

すべての画像ファイル(.jpg で終わるファイル)をリスト表示するには:

ls *.jpg

出力:

image1.jpg  image2.jpg  image3.jpg

疑問符 (?) ワイルドカード

疑問符 ? は、正確に 1 文字にマッチングします。ファイルを見つけるために使用してみましょう。

ls file?.txt

このコマンドは、「file」で始まり、その後に正確に 1 文字が続き、「.txt」で終わるファイルをリスト表示します。

出力:

file1.txt  file2.txt  file3.txt

角括弧 ([]) ワイルドカード

角括弧 [] を使用すると、指定されたセットから任意の 1 文字にマッチングできます。

ls data_0[1-2].csv

このコマンドは、「data_0」で始まり、その後に 1 または 2 が続き、「.csv」で終わる CSV ファイルをリスト表示します。

出力:

data_01.csv  data_02.csv

隠しファイルのリスト表示

Linux では、ドット (.) で始まるファイルは隠しファイルです。ワイルドカードを使用して、これらのファイルも検索できます。

ls .*

出力には以下が含まれます。

.  ..  .hidden_file1  .hidden_file2

注:... は、それぞれ現在のディレクトリと親ディレクトリを表します。

これらのコマンドを試して、結果を観察してください。これらの基本的なワイルドカードを理解することは、ファイルコピー操作に使用する前に不可欠です。

ワイルドカードを使用したファイルのコピー

基本的なワイルドカードを理解したところで、それらを使用してファイルを効率的にコピーしてみましょう。ファイルのコピーの一般的な構文は次のとおりです。

cp [options] source_file(s) destination

いくつかの整理用のディレクトリを作成し、さまざまなパターンでファイルをコピーする練習をしましょう。

特定の拡張子を持つすべてのファイルをコピーする

すべてのテキストファイルを backup ディレクトリにコピーしてみましょう。

cd ~/project/wildcards_lab
cp *.txt backup/

このコマンドは、.txt で終わるすべてのファイルを backup ディレクトリにコピーします。確認してみましょう。

ls backup/

次のように表示されるはずです。

file1.txt  file2.txt  file3.txt  report1.txt  report2.txt  report_final.txt

特定のパターンで始まるファイルをコピーする

次に、すべての画像ファイルを images ディレクトリにコピーしてみましょう。

cp image*.jpg images/

これは、「image」で始まり、「.jpg」で終わるすべてのファイルを images ディレクトリにコピーします。確認してみましょう。

ls images/

出力:

image1.jpg  image2.jpg  image3.jpg

ブレース展開を使用した複数のパターンでのファイルのコピー

ブレース展開 {pattern1,pattern2} を使用すると、複数のパターンを指定できます。PDF ファイルと CSV ファイルの両方を documents ディレクトリにコピーしてみましょう。

cp *.{pdf,csv} documents/

このコマンドは、.pdf または .csv で終わるすべてのファイルを documents ディレクトリにコピーします。確認してみましょう。

ls documents/

出力:

data_01.csv  data_02.csv  data_03.csv  doc1.pdf  doc2.pdf

or (||) を使用した複数のパターンでのファイルのコピー

|| 演算子を使用して、異なるパターンに一致するファイルをコピーすることもできます。

cp report*.txt script.sh backup/

これは、「report」で始まり、「.txt」で終わるすべてのファイルと、script.sh ファイルを backup ディレクトリにコピーします。backup ディレクトリに何があるか確認してみましょう。

ls backup/

更新された出力:

file1.txt  file2.txt  file3.txt  report1.txt  report2.txt  report_final.txt  script.sh

属性を保持したままファイルをコピーする

ファイルをコピーする際、タイムスタンプやアクセス許可などの属性を保持したい場合があります。-p オプションを使用します。

cp -p config.yml backup/

属性が保持されたことを確認するには:

ls -l config.yml
ls -l backup/config.yml

タイムスタンプとアクセス許可は、両方のファイルで同一であるはずです。

これらのコマンドを試して、さまざまなワイルドカードパターンがどのようにファイルの効率的なコピーに役立つかを調べてみてください。

高度なワイルドカードテクニック

基本をマスターしたので、より具体的なファイル操作を実行するための、さらに高度なワイルドカードパターンを見ていきましょう。

高度な操作のための新しいディレクトリの作成

まず、高度なテクニックを練習するための新しいディレクトリを作成しましょう。

cd ~/project/wildcards_lab
mkdir advanced

角括弧を使用した文字クラスの使用

文字クラスを使用すると、文字のセットから単一の文字にマッチングできます。

## 'd' または 'f' で始まるファイルをコピーする
cp [df]*.* advanced/

これは、「d」または「f」で始まるすべてのファイルを advanced ディレクトリにコピーします。確認してみましょう。

ls advanced/

出力:

data_01.csv  data_02.csv  data_03.csv  doc1.pdf  doc2.pdf  file1.txt  file2.txt  file3.txt

文字クラスでの否定の使用

開き括弧の後に ! または ^ 記号を使用して、文字クラスを否定できます。'r' または 'i' で始まらないファイルをコピーしてみましょう。

mkdir advanced/filtered
cp [^ri]*.txt advanced/filtered/

確認してみましょう。

ls advanced/filtered/

出力:

file1.txt  file2.txt  file3.txt

複数のワイルドカードの組み合わせ

さまざまなワイルドカードを組み合わせて、より具体的なパターンを作成してみましょう。

## 'data_0' で始まり、その後に 1 桁の数字が続き、'.csv' で終わるファイルをコピーする
cp data_0?.csv advanced/

この CSV ファイルが正しくコピーされたことを確認しましょう。

ls advanced/*.csv

出力:

advanced/data_01.csv  advanced/data_02.csv  advanced/data_03.csv

拡張グロビングの使用

Bash は、標準のワイルドカードよりも強力な拡張グロビングパターンを提供します。まず、拡張グロビングを有効にします。

shopt -s extglob

これで、次のようなパターンを使用できます。

  • ?(pattern): パターンの 0 回または 1 回の出現にマッチングします
  • *(pattern): 0 回以上の出現にマッチングします
  • +(pattern): 1 回以上の出現にマッチングします
  • @(pattern): 正確に 1 回の出現にマッチングします
  • !(pattern): パターン以外のすべてにマッチングします

例を試してみましょう。

## 数字が続き、その後に .txt が続くファイルをコピーする
mkdir advanced/numbered
cp +([0-9])*.txt advanced/numbered/

元のファイルがこの正確なパターンに一致しないため、結果は空になる可能性があります。一致するファイルを作成してみましょう。

touch 123file.txt
cp +([0-9])*.txt advanced/numbered/
ls advanced/numbered/

出力:

123file.txt

複雑なパターンのためのブレース展開の使用

ブレース展開は、複雑なパターンを作成するのに役立ちます。

## レポートファイル用のディレクトリを作成する
mkdir advanced/reports

## すべてのレポートファイルと設定ファイルをコピーする
cp {report*.txt,*.yml} advanced/reports/

確認してみましょう。

ls advanced/reports/

出力:

config.yml  report1.txt  report2.txt  report_final.txt

これらの高度なテクニックは、ファイルをより正確に選択するのに役立ち、ファイルシステムの管理にかかる時間と労力を節約できます。これらのワイルドカードの組み合わせを試して、ファイル管理をより効率的にする方法を確認してください。

実践的なファイル管理演習

この最終ステップでは、これまで学習したすべてを組み合わせて、実践的なファイル管理の問題を解決します。この演習は、ワイルドカードの理解を強化し、その実用的な応用を実証します。

シナリオ

さまざまな種類のファイルを含むディレクトリを整理する責任のあるシステム管理者であるとします。次のことを行う必要があります。

  1. ファイルの種類別にファイルを識別して分類する
  2. 重要なファイルのバックアップを作成する
  3. 特定の命名パターンに基づいてファイルを抽出する

このシナリオをシミュレートしてみましょう。

シミュレートされたプロジェクトディレクトリの作成

まず、さまざまな種類のファイルを含む新しいプロジェクトディレクトリを作成しましょう。

cd ~/project/wildcards_lab
mkdir project_files
cd project_files

## さまざまな種類のファイルを作成する
touch project_doc_v1.txt project_doc_v2.txt project_doc_final.txt
touch data_2023_01.csv data_2023_02.csv data_2023_03.csv
touch config_dev.yml config_test.yml config_prod.yml
touch backup_script_v1.sh backup_script_v2.sh
touch image001.png image002.png image003.png
touch .project_config .project_log

ディレクトリを確認してみましょう。

ls

出力:

backup_script_v1.sh  config_prod.yml      data_2023_02.csv     image002.png          project_doc_v1.txt
backup_script_v2.sh  config_test.yml      data_2023_03.csv     image003.png          project_doc_v2.txt
config_dev.yml       data_2023_01.csv     image001.png         project_doc_final.txt

注:隠しファイル (. で始まるファイル) は、基本的な ls の出力には表示されません。

ファイルの種類別の整理

次に、さまざまなファイルタイプのディレクトリを作成し、ファイルを整理しましょう。

## ディレクトリを作成する
mkdir docs configs scripts data images backups

## テキストドキュメントを docs ディレクトリにコピーする
cp *doc*.txt docs/

## 設定ファイルを configs ディレクトリにコピーする
cp *.yml configs/

## スクリプトを scripts ディレクトリにコピーする
cp *.sh scripts/

## データファイルを data ディレクトリにコピーする
cp *.csv data/

## 画像を images ディレクトリにコピーする
cp *.png images/

整理を確認してみましょう。

echo "Documents:"
ls docs/

echo "Configurations:"
ls configs/

echo "Scripts:"
ls scripts/

echo "Data files:"
ls data/

echo "Images:"
ls images/

出力:

Documents:
project_doc_final.txt  project_doc_v1.txt  project_doc_v2.txt

Configurations:
config_dev.yml  config_prod.yml  config_test.yml

Scripts:
backup_script_v1.sh  backup_script_v2.sh

Data files:
data_2023_01.csv  data_2023_02.csv  data_2023_03.csv

Images:
image001.png  image002.png  image003.png

包括的なバックアップの作成

すべての重要なファイルを含む包括的なバックアップを作成しましょう。

## すべての画像ファイル以外のファイルのバックアップを作成する
cp !(*.png|*backup*) backups/

## バックアップディレクトリの内容を確認しましょう
ls backups/

出力:

config_dev.yml   config_test.yml  data_2023_01.csv  data_2023_03.csv  project_doc_final.txt  project_doc_v2.txt
config_prod.yml  data_2023_02.csv  project_doc_v1.txt

特定のパターンを持つファイルの検索

次に、特定のパターンに一致するファイルを見つけましょう。

## 2023 年のすべてのファイルを検索する
echo "Files from 2023:"
ls *2023*

## 最終バージョンまたはプロダクションバージョンをすべて検索する
echo "Final/Production versions:"
ls *final* *prod*

## バージョン 2 のファイルをすべて検索する
echo "Version 2 files:"
ls *v2*

出力:

Files from 2023:
data_2023_01.csv  data_2023_02.csv  data_2023_03.csv

Final/Production versions:
config_prod.yml  project_doc_final.txt

Version 2 files:
backup_script_v2.sh  project_doc_v2.txt

実用的なアプリケーション:デプロイメントパッケージの作成

最後に、プロダクション設定と最終ドキュメントのみを含むデプロイメントパッケージを作成しましょう。

mkdir deployment_package
cp *prod*.yml *final*.txt deployment_package/

## デプロイメントパッケージを確認する
ls deployment_package/

出力:

config_prod.yml  project_doc_final.txt

おめでとうございます!Linux ワイルドカードを使用した実践的なファイル管理演習を正常に完了しました。これらのスキルは、Linux 環境でファイルを効率的に管理し、反復的なタスクを自動化し、ファイルシステムを効果的に整理するために非常に役立ちます。

まとめ

この実験では、特定のパターンを持つファイルをコピーし、管理するために、Linux のワイルドカードを効果的に使用する方法を学習しました。アスタリスク (*)、疑問符 (?)、角括弧 ([ ]) などの基本的なワイルドカードから始め、文字クラス、否定、拡張グロビングなどのより高度なテクニックに進みました。

習得した主なスキルは次のとおりです。

  1. ファイルパターンにマッチングするための基本的なワイルドカード (*, ?, [ ]) の使用
  2. 特定の拡張子または命名パターンを持つファイルのコピー
  3. より正確なファイル選択のための高度なワイルドカードテクニックの使用
  4. 複雑なパターンのための複数のワイルドカードとブレース展開の組み合わせ
  5. 実践的なシナリオでのこれらのスキルの適用によるファイルの整理と管理

これらのスキルは、Linux コマンドラインでの作業時の生産性を大幅に向上させ、ファイル管理タスクを自動化し、ファイルシステムを効率的に整理することができます。Linux を使い続けるにつれて、これらのワイルドカードテクニックは、日々の操作において非常に貴重なツールとなるでしょう。

練習が完璧を作ることを忘れないでください。これらのワイルドカードを日常業務で多く使用するほど、より快適になり、習熟度も高まります。