ホーム
おまかせ表示
最近の更新
特別ページ
コミュニティ・ポータル
設定
MochiuWiki : SUSE, EC, PCBについて
免責事項
MochiuWiki : SUSE, EC, PCB
検索
利用者メニュー
ログイン
シェルスクリプトの基礎 - ファイルとディレクトリのソースを表示
←
シェルスクリプトの基礎 - ファイルとディレクトリ
📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは
2026年9月に閉鎖
いたします。
移転先は
https://mochiu.net/index.php?title=シェルスクリプトの基礎 - ファイルとディレクトリ
です。
新しい記事は移転先で追加しております。
(旧サイトでは記事を追加しておりません)
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == シェルスクリプトにおいて、ファイルとディレクトリに関する処理を記載する。<br> <br><br> == ファイルの存在を確認 == ===== ファイルが存在する場合 ===== if文の演算子で、-eを使用することでファイルが存在することを確認することができる。<br> 以下のシェルスクリプトでは、test.txtファイルが存在するか確認して、ファイルが存在する場合、File exists.と表示する。<br> <syntaxhighlight lang="sh"> #!/bin/bash FILE="test.txt" if [ -e $FILE ]; then echo "File exists." fi </syntaxhighlight> <br> ===== ファイルが存在しない場合 ===== 上記と逆の場合、ファイルが存在しないことを確認する場合、演算子に!を付加することで結果を反転させることができる。<br> つまり、! -eと記述することで、ファイルが存在しない場合に真となる。<br> 以下のシェルスクリプトでは、test.txtファイルが存在しない場合に、File not exists.と表示する。<br> <syntaxhighlight lang="sh"> #!/bin/bash FILE="test.txt" if [ ! -e $FILE ];then echo "File not exists." exit -1 fi </syntaxhighlight> <br><br> == ディレクトリの存在を確認 == ===== ディレクトリが存在する場合 ===== if文の演算子で、-dを使用することでディレクトリが存在することを確認することができる。<br> 以下のシェルスクリプトでは、testディレクトリが存在する場合、Directory exists.と表示する。<br> <syntaxhighlight lang="sh"> #!/bin/bash DIR="test" if [ -d $DIR ];then echo "Directory exists." fi </syntaxhighlight> <br> ===== ディレクトリが存在しない場合 ===== 上記と逆の場合、ディレクトリが存在しないことを確認する場合、演算子に!を付加することで結果を反転させることができる。<br> つまり、! -dと記述することで、ディレクトリが存在しない場合に真となる。<br> 以下のシェルスクリプトでは、testディレクトリが存在しない場合に、Directory not exists.と表示する。<br> <syntaxhighlight lang="sh"> #!/bin/bash DIR="test" if [ ! -d $DIR ];then echo "Directory not exists." exit -1 fi </syntaxhighlight> <br><br> == コマンドを使用した確認 == ワイルドカードを指定してファイルおよびディレクトリを確認することができる。<br> ファイル名およびディレクトリ名にワイルドカードを指定して存在を確認する場合、以下のように記述する。(例 : txt拡張子を持つファイル等)<br> <br> 以下の例では、<code>ls *.txt</code>コマンドは、txt拡張子のファイルが存在する場合、なんらかの文字列を返すため、if文の判定は真となる。<br> txt拡張子のファイルが存在しない場合、エラーが発生するので、<code>/dev/null</code>にリダイレクトしている。<br> <syntaxhighlight lang="sh"> if ls *.txt > /dev/null 2>&1; then echo "exists" fi </syntaxhighlight> <br><br> == その他の演算子 == 下表に、ファイルやディレクトリの存在を確認する際に、使用できる演算子を記載する。<br> <center> '''表. 演算子'''<br> {| class="wikitable" |- ! 演算子 !! 説明 |- | -a ファイル || ファイルがあれば真 |- | -b ファイル || ファイルがありブロックス特殊ファイルであれば真 |- | -c ファイル || ファイルがありキャラクター特殊ファイルであれば真 |- | -d ファイル || ファイルがありディレクトリであれば真 |- | -e ファイル || ファイルがあれば真 |- | -f ファイル || ファイルがあり通常のファイルであれば真 |- | -g ファイル || ファイルがありSGID(特殊なアクセス権)であれば真 |- | -G ファイル || ファイルがあり実行グループIDによる所有者であれば真 |- | -h ファイル || ファイルがありシンボリックであれば真(-Lと同じ) |- | -k ファイル || ファイルがありステッキービットが設定されていれば真 |- | -L ファイル || ファイルがありシンボリックであれば真(-hと同じ) |- | -O ファイル || ファイルがあり実行ユーザIDによる所有者であれば真 |- | -p ファイル || ファイルがあり名前付きパイプであれば真 |- | -r ファイル || ファイルがあり読み取り可能であれば真 |- | -s ファイル || ファイルがありサイズが0より大きければ真 |- | -S ファイル || ファイルがありソケットであれば真 |- | -t FD || FD(ファイルディスクリプタ)が端末でオープンされていれば真 |- | -u ファイル || ファイルがありSUID(特殊なアクセス権)であれば真 |- | -w ファイル || ファイルがあり書き込み可能であれば真 |- | -x ファイル || ファイルがあり実行可能であれば真 |} </center> <br><br> == ファイルの処理 == ==== ワイルドカードの使用 ==== ワイルドカード(*)を使用して、カレントディレクトリ内のファイルを順に処理することができる。<br> 以下の例では、全てのファイルを繰り返し処理している。<br> <syntaxhighlight lang="sh"> for FILENAME in *; do echo "$FILENAME" done </syntaxhighlight> <br> 特定の拡張子を持つファイルのみを列挙する場合は、以下のように記述する。<br> 以下の例では、全てのPNGファイルを繰り返し処理している。<br> <syntaxhighlight lang="sh"> for PNGFILE in *.png; do echo "$PNGFILE" done </syntaxhighlight> <br> また、次のように1行で記述することもできる。<br> <syntaxhighlight lang="sh"> for PNGFILE in *.png; do echo "$PNGFILE"; done </syntaxhighlight> <br> ワイルドカードを使用する場合、アスタリスク(*)をクォートの中に入れると、シェルによるワイルドカードの展開が行われない。<br> <br> <syntaxhighlight lang="sh"> # 推奨する記述 ## パス部分は安全にクォートされて、アスタリスクはワイルドカードとして機能する rm -r "$HOME/.cache/"* # 間違った記述 ## アスタリスクがクォート内にあるため、*は文字列として扱われてワイルドカードとして機能しない rm -r "$HOME/.cache/*" ## パスにスペースが含まれている場合、パスが正しく解釈されない ## また、変数が未定義の場合、意図しない動作につながる可能性がある rm -r $HOME/.cache/* </syntaxhighlight> <br> ==== findコマンドの結果の使用(再帰処理) ==== 以下の例では、findコマンドで検索したファイルを、while文で順に処理している。 深い階層にあるファイルも再帰的に処理される。 <syntaxhighlight lang="sh"> find . -type f | while read FILENAME; do echo "$FILENAME" done </syntaxhighlight> <br><br> == テキストファイルの読み込み == while文とreadコマンドを組み合わせて使用すると、テキストファイルの内容を1行ずつ処理できる。<br> <br> このセクションでは、以下に示すlist.txtファイルを使用する。<br> # list.txtファイルの内容 one two three <br> ==== テキストファイルを1行のみ読み込む ==== readコマンドは、ユーザからの入力の他に、ファイルからの入力を1行のみ読み込むことができる。<br> <syntaxhighlight lang="sh"> # 実行 read line < list.txt echo "$line" # 出力 AAA 100 </syntaxhighlight> <br> ==== 標準入力へリダイレクトさせて読み込む ==== ファイルを標準入力へリダイレクトさせて、ファイル内容を1行ずつ読み込ませる。<br> 以下の例では、list.txtファイルの内容を読み込み、1行ずつechoコマンドで表示させている。<br> <syntaxhighlight lang="sh"> # 実行 while read line do echo $line done < ./list.txt # 出力 one two three </syntaxhighlight> <br> ==== ファイルを変数に格納して読み込む ==== ファイル内容をcatコマンドで表示させて、それを変数に格納し、ヒアドキュメントを使用して読み込む。<br> 以下の例では、list.txtファイル内容を変数DATAに格納して、ヒアドキュメントを使用して変数の内容を読み込んでいる。<br> <syntaxhighlight lang="sh"> DATA=`cat ./list.txt` while read line do echo $line done << FILE $DATA FILE # 出力 one two three </syntaxhighlight> <br> ==== catコマンドでファイル内容を表示してパイプで渡す ==== ファイル内容をcatコマンドで表示させて、その結果をパイプを使用して読み込む。<br> 以下の例では、lixt.txtファイルの内容をcatコマンドで表示させて、その結果をパイプでwhile readコマンドに渡している。<br> <syntaxhighlight lang="sh"> # 実行 cat ./list.txt | while read line do echo $line done # 出力 one two three </syntaxhighlight> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:シェルスクリプト]]
シェルスクリプトの基礎 - ファイルとディレクトリ
に戻る。