선택한 파일 확장자를 표시하는 쉘스크립트 가져오기

선택한 파일 확장자를 표시하는 쉘스크립트 가져오기

저는 쉘스크립트와 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원한다면 이 부분을 건너뛰고 그냥 사용해도 됩니다.보너스:피

사용을 시작할 수 있는 또 하나의 방법은 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")

관련 정보