저는 유닉스와 스크립팅을 처음 접했고 사용자로부터 입력 디렉토리를 가져와 존재하는지 확인한 다음 주어진 디렉토리의 파일 수를 현재 디렉토리와 비교하고 그 내용을 보고하는 스크립트를 작성하려고 합니다. 그것은 더 많은 문서입니다. 하위 디렉터리를 입력하는 한 내 코드는 대부분 작동합니다. 스크립트를 사용하여 다른 분기에 상위 또는 다른 하위를 입력하려고 하면 전체 경로가 주어져도 디렉터리를 찾을 수 없습니다. test 명령에 대해 유사한 질문이 제기된 것을 알고 있지만 테스트에서 실제로 존재하는 디렉토리를 인식하지 못할 때 수행할 작업을 설명하는 항목은 없습니다.
dir1=$(pwd)
read -rp "Input the path..." dir2
if [ ! -d "$dir2" ]; then
echo "...does not exist"
else
...
...나머지 코드는 잘 작동합니다. 여기에 문제가 있습니다.
편집: 일반적인 아이디어는 다른 디렉토리에서 디렉토리를 찾는 것이지만 그런 일은 일어나지 않습니다. 예를 들어 ~/public_html의 비밀번호에서 스크립트를 실행하고 ~/schoolwork를 입력하면 전체 경로라도 디렉터리를 인식하지 못합니다.
또한 여기에 게시된 메서드뿐만 아니라 논리(내 함수가 존재하는지 확인한 다음 작업을 수행하고 그렇지 않으면 오류를 반환하도록)를 반대로 했습니다. 결과는 동일합니다.
답변1
당신이 겪고있는 문제는 물결표 확장입니다. ~/schoolwork
스크립트 프롬프트에 입력하는 경우 시작 부분의 물결표는 단지 또 다른 문자일 뿐이며 로 테스트할 때 홈 디렉토리 경로로 확장되지 않습니다 [ ! -d "$dir2" ]
. 마찬가지로 $HOME/schoolwork
변수가 $HOME
확장되지 않으므로 입력할 수 없습니다 .
일반적으로 사용자에게 경로 이름을 묻는 메시지를 표시하는 것은 좋지 않습니다. 스크립트나 프로그램이 실행되기 전에 물결표와 변수가 확장되는 명령줄에 경로 이름을 입력하는 것이 훨씬 쉽습니다. 또한 명령줄에 경로 이름을 지정하면 사용자가 탭 완성을 사용할 수 있으므로 오타 위험이 줄어듭니다.
따라서 사용자가 스크립트를 사용하기를 원합니다.
./script.sh path/to/some/directory
예를 들어,
./script.sh ~/schoolwork
여기,쉘은 경로를 확장합니다스크립트를 호출하기 전에 스크립트는 /home/turfer/schoolwork
첫 번째이자 유일한 매개변수로 경로를 가져옵니다.
좋아요, 그러면 이 스크립트를 어떻게 작성하나요?
시작하기 위한 제안은 다음과 같습니다.
#!/bin/bash
userdir=$1 # the directory pathname passed on the command line
if [ ! -d "$userdir" ]; then
printf 'Your directory, %s, does not exist\n' "$userdir" >&2
exit 1
fi
이제 현재 디렉토리를 계산해야 합니다 $userdir
.모든 유형의 파일(소켓, 심볼릭 링크,목차등. ).
shopt -s dotglob # also match hidden names
herefiles=( ./* )
therefiles=( "$userdir"/* )
그냥 계산하고 싶다면일반 파일, 두 패턴이 일치하는 항목을 반복하고 테스트를 통과한 항목만 고려합니다 [ -f ... ]
(단, 일반 파일에 대한 심볼릭 링크는 여전히 계산됩니다).
이제 우리는 현재 디렉토리와 사용자가 지정한 디렉토리에 있는 모든 것의 이름을 두 개의 배열로 가지고 있습니다. 이제 우리는 이 배열의 길이를 비교하고 어느 것이 가장 긴지 말해야 합니다.
if [ "${#herefiles[@]}" -gt "${#therefiles[@]}" ]; then
printf 'There are more files here than in %s\n' "$userdir"
elif [ "${#herefiles[@]}" -lt "${#therefiles[@]}" ]; then
printf 'There are more files in %s than in here\n' "$userdir"
else
printf 'There are an equal number of files here as in %s\n' "$userdir"
fi
분명히 파일 이름을 두 개의 별도 배열에 수동으로 저장할 수도 있습니다.계산두 루프 모두의 이름입니다.
답변2
다음과 같이 쉘 스크립트를 만들 수 있습니다: ---
#!/bin/bash
read -rp "Input the path..." dir2
dir1=$pwd
#First Check the existence of directory
if [[ -d "$dir2" ]]
then
#If it is a valid directory then count the number of files in each directory
count1=$(find $dir1 -type f | wc -l)
count2=$(find $dir2 -type f | wc -l)
#Compare the number of files in the two directories
if [ $count1 -gt $count2 ]
then
echo "Current Directory has more files"
else if [ $count1 -eq $count2 ]
then
echo "Both Directories have same number of files"
else
echo "Input Directory has greater number of files"
fi
fi
else
#If not a valid directory
echo "Invalid Directory"
fi