📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 Wiki がページ「ファイルやディレクトリの存在を確認する方法(シェルスクリプト)」を「シェルスクリプトの基礎 - ファイルやディレクトリの存在確認」に、リダイレクトを残さずに… |
|||
| (同じ利用者による、間の8版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
シェルスクリプトにおいて、ファイルとディレクトリに関する処理を記載する。<br> | |||
<br><br> | <br><br> | ||
| 8行目: | 7行目: | ||
if文の演算子で、-eを使用することでファイルが存在することを確認することができる。<br> | if文の演算子で、-eを使用することでファイルが存在することを確認することができる。<br> | ||
以下のシェルスクリプトでは、test.txtファイルが存在するか確認して、ファイルが存在する場合、File exists.と表示する。<br> | 以下のシェルスクリプトでは、test.txtファイルが存在するか確認して、ファイルが存在する場合、File exists.と表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 16行目: | 15行目: | ||
echo "File exists." | echo "File exists." | ||
fi | fi | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== ファイルが存在しない場合 ===== | ===== ファイルが存在しない場合 ===== | ||
| 22行目: | 21行目: | ||
つまり、! -eと記述することで、ファイルが存在しない場合に真となる。<br> | つまり、! -eと記述することで、ファイルが存在しない場合に真となる。<br> | ||
以下のシェルスクリプトでは、test.txtファイルが存在しない場合に、File not exists.と表示する。<br> | 以下のシェルスクリプトでは、test.txtファイルが存在しない場合に、File not exists.と表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 29行目: | 28行目: | ||
if [ ! -e $FILE ];then | if [ ! -e $FILE ];then | ||
echo "File not exists." | echo "File not exists." | ||
exit -1 | |||
fi | fi | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 37行目: | 37行目: | ||
if文の演算子で、-dを使用することでディレクトリが存在することを確認することができる。<br> | if文の演算子で、-dを使用することでディレクトリが存在することを確認することができる。<br> | ||
以下のシェルスクリプトでは、testディレクトリが存在する場合、Directory exists.と表示する。<br> | 以下のシェルスクリプトでは、testディレクトリが存在する場合、Directory exists.と表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 45行目: | 45行目: | ||
echo "Directory exists." | echo "Directory exists." | ||
fi | fi | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== ディレクトリが存在しない場合 ===== | ===== ディレクトリが存在しない場合 ===== | ||
| 51行目: | 51行目: | ||
つまり、! -dと記述することで、ディレクトリが存在しない場合に真となる。<br> | つまり、! -dと記述することで、ディレクトリが存在しない場合に真となる。<br> | ||
以下のシェルスクリプトでは、testディレクトリが存在しない場合に、Directory not exists.と表示する。<br> | 以下のシェルスクリプトでは、testディレクトリが存在しない場合に、Directory not exists.と表示する。<br> | ||
< | <syntaxhighlight lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 58行目: | 58行目: | ||
if [ ! -d $DIR ];then | if [ ! -d $DIR ];then | ||
echo "Directory not exists." | echo "Directory not exists." | ||
exit -1 | |||
fi | 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><br> | ||
| 112行目: | 126行目: | ||
</center> | </center> | ||
<br><br> | <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__ | __FORCETOC__ | ||
[[カテゴリ:シェルスクリプト]] | [[カテゴリ:シェルスクリプト]] | ||