재귀 mkdir

재귀 mkdir

내가 간과한 다음 작업을 수행하는 Linux 명령이 있습니까? (의사)

$ mkdir -R foo/bar/zoo/andsoforth

아니면 한 번에 하나의 디렉터리를 만드는 것 외에는 다른 선택이 없습니까?

답변1

$ mkdir -p foo/bar/zoo/andsoforth

매개변수 p는 "상위"를 나타냅니다.

답변2

사용mkdir -p대부분의 최신 운영 체제의 경우 이는 간단한 접근 방식입니다.

mkdir -p foo/bar/zoo/andsoforth

그러나 mkdir -p많은 매뉴얼에서는 권장되지 않습니다. GNU 문서 makeautoconf사용 문제에 대한 정보를 읽어보세요 mkdir -p.

크로스 플랫폼 설치 및 구성 시스템에는 자체 보안이 있습니다.교체mkdir -p.

CMake는 셸 명령줄에서 사용됩니다.

 cmake -E make_directory foo/bar/zoo/andsoforth

Autoconf는 전처리가 포함된 스크립트에서 사용됩니다.

AS_MKDIR_P(foo/bar/zoo/andsoforth)

또는:

AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)

그러나 이러한 솔루션에는 설치 cmake또는 autoconf(및 가능한 전처리) 도구가 필요합니다.M4

install-sh옵션과 함께 스크립트를 사용할 수도 있습니다 -d.

install-sh -d foo/bar/zoo/andsoforth

autoconf이 스크립트는 및 프로젝트에서 사용됩니다 automake. 나는 이것이 가장 안전한 해결책이라고 생각합니다.

당시 저는 /bin/sh표준에 의존하지 않는 크로스 플랫폼 솔루션을 찾고 있었지만 아직 찾지 못했습니다. 그래서 내가 썼다다음 스크립트는 이상적이지 않을 수도 있지만 대부분의 크로스 플랫폼 요구 사항을 충족한다고 생각합니다.:

#! /bin/sh

cdirname() # cross platform alternative for 'dirname'
{
  # $1 - path
  test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
  echo "$1" | sed -n -e '1p' | sed  -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}

mkd() # cross platform alternative for 'mkdir -p'
{
  # $1 - directory to create
  test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
  test -d "$1"  && return 0
  test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
  test -d "$1" || { mkdir "$1" || return 1; }
  return 0
}

-p이 스크립트는 옵션 없이 이전 시스템 에서 사용할 수 있습니다 .mkdir

sed크로스 플랫폼 버전이 dirname코드에 추가되었습니다. 이는 다음과 같이 작동합니다 dirname(paths의 올바른 사용 /, 기본 이름만 있는 경로, trailing s가 있는 경로 /, trailing s가 있거나 없는 경로 \n). 경로에 개행 문자나 현재 로케일에 대해 잘못된 문자가 포함되어 있으면 이 함수가 제대로 작동하지 않습니다. 또한 /( //, ) ///의 모든 조합을 단일로 대체합니다./

경로가 존재하고 유사한 구조를 포함하는 경로에 이 확인이 필요하면 오류가 종료되므로 줄 을 mkdir "$1" || return 1다음으로 변경합니다 ( 존재하지 않는 경우 이전 버전에서 경로를 생성한 다음 다시 생성을 시도합니다).test -d "$1" || { mkdir "$1" || return 1; }mkdiraaa\.aaaaaa

이 버전의 mkd는 경로가 이미 존재하는 경우 오류를 생성하지 않으며(그러나 병렬 실행에서는 여전히 이러한 오류를 생성할 수 있음) 명령줄에서 여러 디렉터리를 가져올 수 없습니다.

답변3

-pmkdirmake 명령의 옵션디렉토리 없음필요에 따라(있는 경우 오류가 발생하지 않음):

mkdir -p foo/bar/zoo/andsoforth

또 다른 방법은 예를 들어 다음을 사용하는 것입니다 &&(지정된 폴더가 존재하는 경우 오류 발생).

mkdir foo && mkdir foo/bar && mkdir foo/bar/zoo && mkdir foo/bar/zoo/andsoforth

연결 연산자는 &&이전 명령이 오류 없이 종료되는 경우에만 다음 명령이 실행되도록 명령을 함께 연결하는 데 사용됩니다.

물론 첫 번째 방법이 더 좋습니다.

답변4

mkdir foo foo/bar foo/bar/zoo/ foo/bar/zoo/andsofort.

이것은 트릭을 수행해야합니다.

관련 정보