스크립트가 파일을 생성해서는 안 되는데도 파일을 생성하려고 합니까?

스크립트가 파일을 생성해서는 안 되는데도 파일을 생성하려고 합니까?

자주 이동하는 일부 폴더가 포함된 폴더가 있으므로 해당 폴더가 있는지 확인하고 없으면 생성하는 스크립트를 만들었습니다. 이것이 내가 한 일입니다. (내 생각에는) 달성할 수 있을 것 같습니다.

if [ ! -f "$DIR/0folder" ]
then
mkdir "$DIR/0folder"
fi

하지만 0folder이미 거기에 있는데도 여전히 mkdir나에게 말하려고 노력하고 있습니다. 여기처럼요.

mkdir: /Allfoldersgoeshere/subfolder/0folder: File exists

왜? 이미 존재하므로 무시해야 합니까?

답변1

테스트에서 -f다음 사항을 확인하고 있습니다.FILE존재하며 일반 파일입니다.. 당신에게 필요한 것은 -d다음과 같은지 테스트하는 것 입니다.FILE존재하며 디렉토리입니다.

if [ ! -d "$DIR/0folder" ]
then
mkdir "$DIR/0folder"
fi

그러나 디렉토리가 존재하는지 확인하는 것이 필수는 아닙니다. 매뉴얼 페이지에 따르면 mkdir다음을 볼 수 있습니다.

man mkdir | grep -A1 -- -p

   -p, --parents
          no error if existing, make parent directories as needed

그러나 만일FILE존재하며 일반 파일입니다. mkdir -p실패할 것이다

mkdir: /Allfoldersgoeshere/subfolder/0folder': Not a directory.  

이 경우 file디렉터리를 생성하기 전에 예상되는 a를 처리해야 합니다.directory

답변2

~에서수동man bash( ) 조건식에서:

-f file
          True if file exists and is a regular file.

-d file
          True if file exists and is a directory.

따라서 파일이 아닌 디렉터리가 존재하는지 확인하려면...

if [[ ! -d "$DIR/0folder" ]] ; then
    mkdir "$DIR/0folder"
fi

답변3

-d-f또는 여기서는 동일한 동전의 양면에 불과하므로 강력한 테스트에 쓸모가 없습니다 .

touch file; [ ! -d file ] && mkdir file
mkdir: cannot create directory ‘file’: File exists

바라보다? [ -e ... ] || mkdir ...확인 하는 것이 좋습니다존재하다, 이는 적어도 위의 오류를 방지하지만, 이것에도 경쟁 조건이 있거나 필요에 따라 부모를 생성하지 않거나 해결되지 않은 심볼릭 링크와 같은 문제가 있습니다.

if    [ ! -e "$DIR/0folder" ] && 
      [ ! -L "$DIR/0folder" ] 
then  mkdir -- "$DIR/0folder"
fi

...더 가깝지만 여전히 우아하지 않으며 여전히 모든 부모가 존재한다고 가정합니다.

필요하다면 확신할 수도 있지만 test실제로는 그렇지 않습니다. 원자성 디렉터리 생성을 사용 mkdir -p하고 그 반환을 테스트할 수 있습니다. 원자적인 fs 작업을 제공하는 표준 셸 도구는 많지 않습니다. 우리는 이러한 도구를 활용하는 것이 좋습니다.

답변4

당신이 하고 있는 일은 $DIR/0 폴더가 존재하지 않는다면, 그 이름을 가진 디렉토리를 생성하는 것입니다.

-f(파일)을 -d(디렉토리)로 변경하면 됩니다.

이렇게 하면 문제가 해결됩니다. 이제 사람들이 여기에 제공한 팁 중 일부에 관심이 있을 수 있지만 이는 별개입니다.

관련 정보