파일이 디렉토리에 존재한다면...? [복사]

파일이 디렉토리에 존재한다면...? [복사]

if 문을 만들려고 합니다.

이 디렉토리에 있는 파일의 확장자가 .PDF인 경우 다음을 수행하고, 그렇지 않은 경우 다음을 수행하십시오.

Bash에서 이 작업을 수행하는 방법을 알아내는 데 문제가 있습니다. 여기에서 확인했습니다.https://stackoverflow.com/questions/3856747/check-whether-a-certain-file-type-extension-exists-in-directory

첫째, 나열된 솔루션이 작동하지 않거나 해결 방법을 모르는 오류가 발생합니다.

아래에 내 스크립트가 첨부되어 있습니다. 이전 질문에서 작업 중이던 스크립트를 약간 수정했습니다.파일 확장자만 변경

스크립트는 다음과 같습니다.

#!/bin/bash
#shebang for bourne shell execution
echo "Hello this is task 1 of the homework"
 #Initial prompt used for testing to see if script ran


#shopt allows configuration of the shell -s dotglob allows the script to run on dot-files
shopt -s dotglob

#loop to iterate through each file in Task1 directory and rename them
#loop runs if there is a file type of ".PDF" in the folder Task1, if there isn't displays that there i
sn't a file of that type and terminates 
if [ [ -n $(echo *.PDF) ] ] # what should I put here???  
then
        for file in Task1/*.PDF;
        do

                mv "$file" "${file%.PDF}.pdf"
                echo "$file has been updated"
        done
else
                echo "No files of that type..."
fi
~           

**편집 1:**

아래 Ipor Sircer의 답변을 바탕으로 스크립트를 다음과 같이 변경했습니다.

#!/bin/bash
#shebang for bourne shell execution
echo "Hello this is task 1 of the homework"
 #Initial prompt used for testing to see if script ran


#shopt allows configuration of the shell -s dotglob allows the script to run on dot-files
shopt -s dotglob

#loop to iterate through each file in Task1 directory and rename them
#loop runs if there is a file type of ".PDF" in the folder Task1, if there isn't displays that there isn't a file of that type and terminates 
if [ ls -1 *.PDF|xargs -l1 bash -c 'mv $0 ${0%.PDF}.pdf' ]
then
        for file in Task1/*.PDF;
        do

                mv "$file" "${file%.PDF}.pdf"
                echo "$file has been updated"
        done
else
                echo "No files of that type..."
fi

다음 오류가 발생합니다.

안녕하세요 숙제 1 입니다

./Shell1.sh: 12행: [: `]' 누락

mv: 계산할 수 없음 ']': 해당 파일이나 디렉터리가 없습니다

이런 종류의 파일이 없습니다...

편집 2

Eric Renouf의 의견을 바탕으로 간격을 수정하면 다음 스크립트가 제공됩니다.

#!/bin/bash
#shebang for bourne shell execution
echo "Hello this is task 1 of the homework"
 #Initial prompt used for testing to see if script ran


#shopt allows configuration of the shell -s dotglob allows the script to run on dot-files
shopt -s dotglob

#loop to iterate through each file in Task1 directory and rename them
#loop runs if there is a file type of ".PDF" in the folder Task1, if there isn't displays that there isn't a file of that type and terminates 
if [[ -n $(echo *.PDF) ]]
then
        for file in Task1/*.PDF;
        do

                mv "$file" "${file%.PDF}.pdf"
                echo "$file has been updated"
        done
else
                echo "No files of that type..."
fi

그러나 두 번 실행하면 다음과 같은 내용이 표시됩니다.

안녕하세요 숙제 1 입니다

mv: "Task1/*.PDF"를 계산할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

작업1/*.PDF가 업데이트되었습니다.

echo폴더에 .PDF 유형의 파일이 더 이상 없기 때문에 다른 내용을 볼 수 없는 이유는 무엇입니까 ?

답변1

shopt -s nullglob

set -- Task1/*.PDF

if (( $# > 0 )); then
   printf 'There are %d PDF files in "Task1"\n' "$#"
else
   echo 'There are no PDF files in "Task1"'
fi

set위치 매개변수는 하위 디렉토리에서 사용 가능한 각 PDF 파일의 이름 으로 설정됩니다 . Task1이는 호출 스크립트를 사용하는 것과 같습니다 ./script Task1/*.PDF.

위치 인수 수를 보유하고 $#0보다 큰지 테스트합니다. 그렇다면 사용 가능한 PDF 파일 수를 보고합니다. 그렇지 않으면 아무 것도 보고하지 않습니다. 이 두 가지 작업 대신 원하는 작업을 수행하도록 선택할 수 있습니다.

작업이 .PDF해당 파일의 접미사를 소문자로 바꾸는 것이라면 먼저 존재 여부를 확인할 필요가 없습니다.

shopt -s nullglob

for fpath in Task1/*.PDF; do
  mv "$fpath" "${fpath%.PDF}.pdf"
done

쉘 옵션을 설정하면 패턴과 일치하는 파일이 없을 경우 in 값을 nullglob얻지 못합니다 .*fname

답변2

ls -1 *.PDF|xargs -l1 bash -c 'mv $0 ${0%.PDF}.pdf'

답변3

당신이 사용할 수있는:

[ -e *.PDF ]

바꾸다

[ [ -n $(echo *.PDF) ] ] 

예를 들어

[ -e *.PDF ] && echo 'yes'

관련 정보