bash 스크립트에서 파일 이름 확장자를 확인하는 방법
저는 bash에서 야간 빌드 스크립트를 쓰고 있습니다.
작은 장애 하나만 제외하면 모든 것이 잘 되고 멋있어.
#!/bin/bash
for file in "$PATH_TO_SOMEWHERE"; do
if [ -d $file ]
then
# do something directory-ish
else
if [ "$file" == "*.txt" ] # this is the snag
then
# do something txt-ish
fi
fi
done;
문제는 파일 확장자를 결정하고 그에 따라 행동하는 것입니다.문제가 if-statement에 있는 것을 알고 있습니다.txt 파일을 테스트하고 있습니다.
파일에 다음 파일이 있는지 확인하려면 어떻게 해야 합니까?.txt
서픽스?
만들다
if [ "$file" == "*.txt" ]
다음과 같습니다.
if [[ $file == *.txt ]]
즉, 따옴표는 없고 이중 괄호로 묶은 것입니다.
의 오른쪽==
는 셸 패턴입니다.정규 표현이 필요한 경우,=~
그리고나서.
"$file의 마지막 네 글자는 다음과 같습니까?.txt
?" 이 경우 다음을 사용할 수 있습니다.
if [ "${file: -4}" == ".txt" ]
주의: 이 간격은file:
그리고.-4
':-' 수식어는 다른 것을 의미하기 때문에 필수입니다.
다음 작업도 가능합니다.
if [ "${FILE##*.}" = "txt" ]; then
# operation for txt files here
fi
Unix 시스템에서는 .txt 파일이 텍스트 파일인지 확인할 수 없습니다.가장 좋은 방법은 "파일"을 사용하는 것입니다.다음을 사용해 보십시오.
file -ib "$file"
그런 다음 MIME 유형 목록을 사용하여 "텍스트", "응용 프로그램" 등의 정보를 얻을 수 있는 MIME의 첫 번째 부분을 비교하거나 구문 분석할 수 있습니다.
확장자에 의존하지 않고 실제로 파일에 대한 정보를 검색하려면 "file" 명령을 사용할 수 있습니다.
내선번호를 사용하는 것이 불편하지 않은 경우 GREP를 사용하여 일치하는지 여부를 확인할 수 있습니다.
Linux에서 파일명으로 사용할 수 있는 확장자를 가져오는 방법에 대한 정답은 다음과 같습니다.
${filename##*\.}
디렉토리의 모든 파일 확장자를 인쇄하는 예
for fname in $(find . -maxdepth 1 -type f) # only regular file in the current dir
do echo ${fname##*\.} #print extensions
done
'file'과 마찬가지로 파일 확장자에 관계없이 작동하는 조금 더 간단한 'mimtype -b'를 사용합니다.
if [ $(mimetype -b "$MyFile") == "text/plain" ]
then
echo "this is a text file"
fi
편집: mimetype을 사용할 수 없는 경우 시스템에 libfile-mimeinfo-perl을 설치해야 할 수 있습니다.
파일 형식을 보고 복사하는 bash 스크립트를 작성했습니다. 이 스크립트를 사용하여 파이어폭스 캐시에서 온라인으로 본 비디오를 살펴봅니다.
#!/bin/bash
# flvcache script
CACHE=~/.mozilla/firefox/xxxxxxxx.default/Cache
OUTPUTDIR=~/Videos/flvs
MINFILESIZE=2M
for f in `find $CACHE -size +$MINFILESIZE`
do
a=$(file $f | cut -f2 -d ' ')
o=$(basename $f)
if [ "$a" = "Macromedia" ]
then
cp "$f" "$OUTPUTDIR/$o"
fi
done
nautilus "$OUTPUTDIR"&
여기에 제시된 것과 유사한 아이디어를 사용하므로, 이것이 누군가에게 도움이 되기를 바랍니다.
그런 것 같아요'$PATH_TO_SOMEWHERE'
뭐랄까'<directory>/*'
.
이 경우 코드를 다음과 같이 변경합니다.
find <directory> -maxdepth 1 -type d -exec ... \;
find <directory> -maxdepth 1 -type f -name "*.txt" -exec ... \;
디렉토리 및 텍스트파일명으로 보다 복잡한 작업을 수행할 경우 다음을 수행할 수 있습니다.
find <directory> -maxdepth 1 -type d | while read dir; do echo $dir; ...; done
find <directory> -maxdepth 1 -type f -name "*.txt" | while read txtfile; do echo $txtfile; ...; done
파일 이름에 공백이 있는 경우 다음을 수행할 수 있습니다.
find <directory> -maxdepth 1 -type d | xargs ...
find <directory> -maxdepth 1 -type f -name "*.txt" | xargs ...
이 답변의 대부분은 @Jox에 있습니다만, (js)가 .json 파일과 일치하고 있는 것을 발견했기 때문에 eol 문자를 추가하여 확장자와 보다 완전하게 일치시킵니다.
$file
[ ]은(는) 전개되지 않기 때문에 공백은 문제가 되지 않기 때문에 인용할 필요가 없습니다(크레디트:Hontvari Levente)
if [[ $file =~ .*\.(js$|json$) ]]; then
echo "The extension of '$file' matches .js|.json";
fi
또 다른 중요한 세부사항은else
한 번if
★★★★
else
if [ "$file" == "*.txt" ]
# this is the snag
then
# do something txt-ish
fi
대신:
elif [ "$file" == "*.txt" ]
# this is the snag
then
# do something txt-ish
fi
else
다른 명령어가 없을 때 사용합니다.> do > that 명령어
당신이 꼭 해야 하는 것은 아닌 무언가를 할 수 있다고 해서 항상 해야 한다는 것은 아니다.
언급URL : https://stackoverflow.com/questions/407184/how-to-check-the-extension-of-a-filename-in-a-bash-script
'programing' 카테고리의 다른 글
iPhone에서 사용자가 푸시 알림을 활성화했는지 확인합니다. (0) | 2023.04.10 |
---|---|
How to create a link inside a cell using EPPlus (0) | 2023.04.10 |
어레이의 각 루프에 대해를 사용하려면 어떻게 해야 합니까? (0) | 2023.04.10 |
Swift 포함기존 UIKit 응용 프로그램의 UI 보기 (0) | 2023.04.10 |
오브젝트 속성을 기반으로 오브젝트 목록을 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.10 |