私はシェルスクリプトとLinuxに初めて遭遇しました。私は私が望むandyファイル拡張子を検索してから、それらのうちのいくつがあるかどうかを示す簡単なプログラムを書いていきます。
オンラインで検索し、私が所有している本を読んでみましたが、とてもわかりません。
これが私が今まで得たものです:
#!/bin/bash
#Program to search for how many of specific file extension there is in this directory.
echo "Write the file extension you want to search for:"
read n
for n in `ls *.txt` ; do
echo $n
done
forループを使いたいです。
ここで続行するにはどうすればよいですか?
答え1
すでに述べたように、通常はfind
ファイル操作に適したツールです。しかし、完全に大丈夫かもしれません。
printf
必要に応じて、この部分をスキップして使用するだけです。ボーナス:血
使用を開始するもう1つの方法は、printf
一般的に優れたオプションですecho
。最も単純な形式は次のとおりです。
printf "Some text\n"
\n
改行文字はどこにありますか?一部の変数を印刷するには、特殊記号%s
(文字列用)を使用できます。
printf "Name is %s \n" "$name"
| |
| +---- value
+---------------- format string
printf "Name is %s city is %s \n" "$name" "$city"
| | |
| +-------+----- values
+------------------------------------ format string
%d
(数字用)などの他の記号を使用することもできます。\t
(タブ)などの他の特殊文字を使用することもできます。
$(cmd)
コードの場合、通常は「cmd」の代わりに最新のコマンドを使用することをお勧めします。あなたのコードでは次のようになります。
$(ls *.txt)
次に注目すべきはfor
屋根です。あなたの声明
for n in `ls *.txt`; do
あなたが思うようにしないでください。これはn
変数名として扱われ、結果はls *.txt
その変数名に割り当てられます。ファイルがある場合:
a.txt
b.txt
c.txt
コードの実行は次に拡張されます。
for n in a.txt b.txt c.txt; do
つまり、繰り返しごとにn
次のファイル名に設定されます。あなたは次のように終わります:
n=a.txt (first loop)
n=b.txt (second loop)
n=c.txt (last loop)
これらを集めて次のように書くことができます。
#!/bin/bash
printf "Write the file extension you want to search for: "
read ext
printf "Searching for files with extension '%s'\n" "$ext"
for file in *"$ext"; do
printf "File: %s\n" "$file"
done
あるいは、単に次のように言うこともできます。
ls *"$ext"
ちなみにアスタリスクは外部引用符。それ以外の場合は拡張されません。
答え2
おそらく使用する必要がありますfind
。それは次のとおりです。
echo "Write the file extension you want to search for:"
read n
find . -name "*.$n"
とにかく、おそらくあなたがしたいことは次のとおりです。
for i in *."$n"
do
echo "$i"
done
それ以外の場合は、値を使用せずn
(代わりに固定拡張を使用)、txt
ループから読み取られた値を上書きします。n
for
答え3
できます:
#!/bin/bash
echo -n "Write the file extension you want to search for:"
read n
find $1 -iname "*.$n" -print
使用法:
./myscript.sh mypath
出力は次のとおりです
root@debian:/home/mohsen/test# ./myscript.sh /home/mohsen
Write the file extension you want to search for:sh
/home/mohsen/Downloads/binary files/apt-fast_aria2c.sh
/home/mohsen/Downloads/binary files/apt-fast.sh
/home/mohsen/Downloads/binary files/toggle_touchpad.sh
/home/mohsen/Downloads/binary files/nvidia-versions.sh
/home/mohsen/Downloads/R/x/PacketTracer601/set_ptenv.sh
/home/mohsen/codes/IraninCalendar/test/jcal-master/sources/ltmain.sh
/home/mohsen/codes/IraninCalendar/test/jcal-master/sources/autogen.sh
^C
答え4
必要なandyファイル拡張子を検索し、いくつか見つかったかどうかを確認します。
まったくループする必要はありません。ファイル名に改行文字がないと仮定すると、次のように書くことができます。
wc -l < <(ls *."$n")