Bash 스크립트에서 파일 이름의 확장을 확인하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/407184

  •  03-07-2019
  •  | 
  •  

문제

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 진술에있어 TXT 파일을 테스트하는 것입니다.

파일에 .txt 접미사가 있는지 확인하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

"$ 파일의 마지막 4 자입니다. .txt"그렇다면 다음을 사용할 수 있습니다.

if [ ${file: -4} == ".txt" ]

사이의 공간은 주목하십시오 file: 그리고 -4 ':'수정자는 다른 것을 의미하므로 필요합니다.

다른 팁

만들다

if [ "$file" == "*.txt" ]

이와 같이:

if [[ $file == *.txt ]]

즉, 이중 괄호와 따옴표가 없습니다.

오른쪽 == 쉘 패턴입니다. 정규 표현이 필요한 경우 사용하십시오 =~ 그 다음에.

.txt 파일은 진정으로 텍스트 파일이라는 UNIX 시스템에서 확신 할 수 없습니다. 가장 좋은 방법은 "파일"을 사용하는 것입니다. 사용해보십시오 :

file -ib "$file"

그런 다음 MIME 유형 목록을 사용하여 "Text", "Application"등과 같은 물건을 얻는 MIME의 첫 부분과 일치하거나 구문 분석 할 수 있습니다.

실제로 확장자에 의존하지 않고 파일에 대한 정보를 찾으려면 "파일"명령을 사용할 수 있습니다.

확장자를 사용하는 데 익숙하다고 느끼면 Grep을 사용하여 일치하는지 확인할 수 있습니다.

당신은 또한 할 수 있습니다 :

   if [ "${FILE##*.}" = "txt" ]; then
       # operation for txt files here
   fi

'파일'과 유사하게 파일 확장자에 관계없이 작동하는 약간 간단한 'Mimetype -B'를 사용하십시오.

if [ $(mimetype -b "$MyFile") == "text/plain" ]
then
  echo "this is a text file"
fi

편집 : Mimetype을 사용할 수없는 경우 시스템에 libfile-mimeinfo-perl을 설치해야 할 수도 있습니다.

파일의 유형을보고 위치에 복사하는 Bash 스크립트를 작성했습니다. Firefox 캐시에서 온라인으로 본 비디오를 살펴 보는 데 사용합니다.

#!/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 ...

Linux의 파일 이름으로 제공되는 확장 방법에 대한 정답은 다음과 같습니다.

${strFileName##*\\.} 

디렉토리에서 모든 파일 확장을 인쇄하는 예

for fname in $(find . -maxdepth 1 -type f) # only regular file in the current dir
    do  echo ${fname##*\.} #print extensions 
done

컷과 함께 가져 가라

>cut -d'.' -f2<<<"hi_mom.txt"
txt

awk와 함께 그것을 취하는 것은 다음과 같은 것입니다.

>MY_DATA_FILE="my_file.sql"
>FILE_EXT=$(awk -F'.' '{print $NF}' <<< $MY_DATA_FILE)
>if [ "sql" = "$FILE_EXT" ]
>then
>   echo "file is sql"
>fi

>awk -F'.' '{print $NF}' <<eof
>hi_mom.txt
>my_file.jpg
>eof
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top