我对 shellscript 和 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
通常是处理文件时的正确工具。但它也可以是完全OK的。
printf
如果需要,您可以跳过这部分,仅将其作为奖金:P
您还可以开始使用的一件事是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")