获取 shellscript 以显示选定的文件扩展名

获取 shellscript 以显示选定的文件扩展名

我对 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读取的值,nfor

答案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")

相关内容