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'