존재하지 않는 파일을 생성하는 쉘 스크립트?


20

파일의 존재 여부를 확인하는 쉘 스크립트를 작성해야하며, 존재하지 않는 경우 파일을 작성하고 다음 명령으로 이동하거나 다음 명령으로 이동하십시오. 내가하지 않은 것은.

#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi

# Next command (macOS preference setting)
defaults write ...

반품

line 5: [!: command not found
mkdir: /Scripts: File exists

어떻게해야할지 모르겠다. Google 검색에서 제공하는 모든 장소는 다른 것을 나타냅니다.


6
shellcheck.net에 코드를 넣고 제안을 검토하십시오
roaima

12
당신 touch이 파일 만 할 수 없으며 조건부를 건너 뛸 수있는 이유는 무엇입니까?
kirkpatt

아래의 다른 답변은 구문 오류 ( [와 사이에 공백이 없음 !)를 해결하지만 [Unix의 실제 명령 인 것을 지적하는 것이 좋습니다 . 유닉스 명령에는 명령 이름과 인수 사이에 공백이 필요합니다. 예, Bash builtin 이기도하지만 /usr/bin/[대부분의 시스템 에는 바이너리가 있습니다.
TheDudeAbides

답변:


44

아마도 더 간단한 해결책, 명시 적 테스트를 수행 할 필요가 없으며 다음을 사용하십시오.

mkdir -p /Scripts
touch /Scripts/file.txt

당신은 존재하는의 "수정"시간이 원하지 않는 경우 file.txt에 의해 변경 될 수를 touch, 당신이 사용할 수 touch -a /Scripts/file.txt있도록 touch단지 "접근"과 "변화"시간을 변경합니다.


1
mtime에 신경 쓰지 않는다면을 사용할 수 있습니다 >>/Scripts/file.txt. 추가 할 파일을 열고 존재하지 않는 경우 파일을 만듭니다.
kojiro

30

사이에 공백이 없기 때문에 오류를 얻고있다 [!그러나 코드에서 일부 결함도 있습니다. 먼저 파일이 존재하지 않는지 확인하고 그렇지 않은 경우 아무것도하지 않습니다. 파일이 존재하면 디렉토리를 작성하는 것입니다 (그러나 파일 작성을위한 조치는 수행하지 않음).

또한 null 연산이 필요하지 않으므로 간단하게 수행 할 수 있습니다.

#! /bin/bash -
if [[ ! -e /Scripts/file.txt ]]; then
    mkdir -p /Scripts
    touch /Scripts/file.txt
fi

[command2]

/Scripts/file.txt존재하지 않는지 확인하면 /Scripts디렉토리 가 생성 되고 file.txt파일 이 생성 됩니다. 원하는 경우 디렉토리의 존재 여부를 별도로 확인할 수도 있습니다. 또한 "일반 파일" http://tldp.org/LDP/abs/html/fto 인지 확인하는 위치에서 수행 할 파일의 존재 여부를 간단히 확인하도록 요청 하는 -e대신 사용 -f하고 있습니다 . html-e-f


@roaima에게 감사합니다. 귀하의 제안으로 답변을 업데이트했습니다.
Jesse_b

파일이 존재하지 않지만 디렉토리는 무엇입니까?
개미

3
@Ant : mkdir -p : 이미 존재하는지에 대한 불평없이 필요한 모든 디렉토리를 만듭니다. 예 : mkdir / home / user1 / tmp : / home 또는 / home / user1 디렉토리가 이미 존재한다는 사실과 상관없이이 계층을 작성합니다. touch는 기존 파일의 시간 만 업데이트하거나 파일이없는 경우 새 파일을 만듭니다. 디렉토리가 존재하고 그 안에 파일이 존재하는지 확인하려는 경우 if ... then part를 제거 할 수도 있습니다.
Olivier Dulac

내가 참조! 명확하게 해 주셔서 감사합니다 :)
개미

11

우선 쉘 스크립트bash script 가 아니므로 코드를 좀 더 일반적인 것으로 만들어 보자.

#!/bin/sh

모든 Posix 시스템에는 해당 파일이 있어야합니다. bash는 엄격하게 선택 사항입니다.

디렉토리가 존재하는지 테스트 할 필요가 없습니다.

dir=/Scripts
mkdir -p $dir

파일이없는 경우 파일을 만들려면

filename=$dir/file.txt
test -f $filename || touch $filename

또는 원하는 경우

filename=$dir/file.txt
if [ ! -f $filename ]
then
    touch $filename
fi


3
#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
CHECKFILE="/Scripts/file.txt"

CHECKDIR=$( dirname "$CHECKFILE" )

# The directory with the file must exist
mkdir -p "$CHECKDIR"
if [ ! -f "$CHECKFILE" ]; then
    # What to do if the file is not there
fi
touch "$CHECKFILE"

상기는 이러한 생성과 같은 더 "속임수"가없는 것으로 간주 디렉토리 라고 /Scripts/file.txt( 항상 경우 분기를 입력에 스크립트를 강제의 방법이 될이). "file"이 디렉토리이면 -f 테스트가 실패하고 touch 명령이 변경되지 않습니다.


0

내 접근 방식

#!/bin/sh

# input might contains spaces and other characters
FILEPATH="/tmp/some where/the file.blah"

# extract the file + dir names
FILE="`basename "${FILEPATH}"`"
DIR="`dirname "${FILEPATH}"`"

# create the dir, then the file
mkdir -p "${DIR}" && touch "${DIR}/${FILE}"

# show result
ls -l "$FILEPATH"

산출

  ./dofile.sh
  -rw-r--r-- 1 jmullee jmullee 0 Nov 15 21:23 /tmp/some where/the file.blah

.


1
파일이 있는지 확인하지 않습니다
PiedPiper

그가하는 @piepdpiper,이에 impliciit입니다 touchmkdir -p
xenoid

더 많은 검사가있는 동일한 아이디어는 다음과 같습니다. D = / boot / bork; F = fnord; mkdir -p "$ D"&& {touch "$ D / $ F"&& echo "created $ D / $ F OK"; } || {echo "dir '$ D'를 만들 수 없습니다"; }
jmullee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.