해당 디렉터리에서 가장 많은 문자가 포함된 파일을 찾기 위해 전체 파일 디렉터리를 반복하는 스크립트를 만들려고 합니다. 첨부된 코드 샘플은 다음과 같습니다. 내가 뭘 잘못했나요?
1 #!/bin/bash
2 #This program takes an array of files and sees which is the largest in a directory
3
4 files=() #create an Empty array for which files will be stored
5 longest=${files[0]} #Sets point of origin for the current largest file at 0
6
7 echo "Enter Directory name:"
8 read dir_name
9
10 if [ -d "$dir_name" ]; then #Test file to see if it's a directory
11
12 for i in "$dir_name"/* #For loop to discern the file with the most characters
13 do
14 files=$dir_name
15 if [ "${#i}" -gt "${#longest}" ]; then
16 longest="$i"
17 echo "$i && Character count:${#files[i]}"
18 fi
19 done
20
21 elif [ ! -d "$dir_name" ]
22 then
23 echo "Sorry not the directory we are looking for"
24 exit 0
25 fi
26
27
답변1
귀하의 코드에 몇 가지 오류가 있습니다.
- 루프에는
for
시작이나 끝에 a가 없습니다.do
done
if [ ... ] then
한 줄로 쓰면;
에 넣어야 합니다then
.- 스크립팅 목적으로 파일을 배열에 저장할 필요가 없으며 디렉터리의 파일을 직접 반복할 수 있습니다.
업데이트: 원하는 작업을 수행하기 위해 스크립트를 다시 작성했습니다. 디렉터리에서 가장 긴 파일 이름을 가진 파일을 가져와서 문자 수를 사용하여 인쇄합니다.
#!/bin/bash
longest=0
if [ $# -lt 1 ]; then # if no argument given, read the directory from input
echo -n "Enter directory name: "
read dir_name
else
dir_name=$1 # this allows execute the script with the directory as argument
fi
if [ -d "$dir_name" ]; then # process if what was given is a directory
for file in "$dir_name"/* ; do
if [ -f "$file" ]; then # do it only for files
filename=$(basename $file) # get only the filename: NOT in all UNIX
if [ ${#filename} -gt $longest ]; then
longest=${#filename} # store new longest
longest_file=$file # save the file
fi
fi
done
# we are done, print results
echo -n "The file with longest filename is" $longest_file
echo " with a filename" $longest "characters long"
fi
시험:
다음과 같은 일반 파일이 포함된 "test" 디렉터리가 제공됩니다.
a ab abc abcd
스크립트의 출력은 다음과 같습니다.
The file with longest filename is test/abcd with a filename 4 characters long