再帰 mkdir

再帰 mkdir

私が見落とした次のタスクを実行するLinuxコマンドはありますか? (医師)

$ mkdir -R foo/bar/zoo/andsoforth

それとも、一度に1つのディレクトリを作成する以外に選択肢はありませんか?

答え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)

しかし、これらのソリューションにはインストールまたはcmakeautoconfおよび可能な前処理)ツールが必要です。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(パスの正しい使用/、デフォルト名のみのパス、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.

これはトリックを行う必要があります。

関連情報