자주 이동하는 일부 폴더가 포함된 폴더가 있으므로 해당 폴더가 있는지 확인하고 없으면 생성하는 스크립트를 만들었습니다. 이것이 내가 한 일입니다. (내 생각에는) 달성할 수 있을 것 같습니다.
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(디렉토리)로 변경하면 됩니다.
이렇게 하면 문제가 해결됩니다. 이제 사람들이 여기에 제공한 팁 중 일부에 관심이 있을 수 있지만 이는 별개입니다.