저는 쉘스크립트와 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
루프에서 읽은 값을 덮어씁니다.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")