私が見落とした次のタスクを実行する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のドキュメントmake
とautoconf
使用上の問題に関する情報を読んでくださいmkdir -p
。
- http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Limitations-of-Usual-Tools.html#Limitations-of-Usual-Tools
- http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Utilities-in-Makefiles.html
クロスプラットフォームのインストールおよび構成システムには独自のセキュリティがあります。交換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
(パスの正しい使用/
、デフォルト名のみのパス、trailing sのあるパス/
、trailing sの有無のパス\n
)。パスに改行文字または現在のロケールに無効な文字が含まれている場合、この関数は正しく機能しません。また、/
(//
、)///
のすべての組み合わせを単一に置き換えます。/
パスが存在し、同様の構造を含むパスにこのチェックが必要な場合はエラーが終了するため、行をmkdir "$1" || return 1
次のように変更します(存在しない場合は、以前のバージョンでパスを作成して再作成しようとします)。test -d "$1" || { mkdir "$1" || return 1; }
mkdir
aaa\.
aaa
aaa
このバージョンのmkdは、パスがすでに存在する場合はエラーを生成しません(ただし、並列実行ではまだこれらのエラーを生成できます)、コマンドラインから複数のディレクトリをインポートすることはできません。
答え3
-p
mkdir
make コマンドのオプション血ディレクトリなし必要に応じて(存在する場合はエラーは発生しません):
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.
これはトリックを行う必要があります。