ファイルをディレクトリにシンボリックリンクすると、ディレクトリが存在しない場合に作成されます。

ファイルをディレクトリにシンボリックリンクすると、ディレクトリが存在しない場合に作成されます。

次のコマンドのようなシンボリックリンクを作成したいとします。

ln -s /home/user/dots/cmus/cmus.theme /home/user/cmus/cmus.theme

ただし、上記のコマンドが機能するには、ディレクトリが/home/user/cmusすでに存在することを確認する必要があります。それ以外の場合はエラーが発生します。この問題を解決する方法はありますかmkdir -p

私の問題を明確にするためにユースケースを書きましょう。適切な場所にドットファイルをシンボリックリンクするシェルスクリプトを作成したいと思います。これまで私は以下を持っています:

DIR=$HOME/projects/dotFiles

DOTFILES=(
    "bin"
    ".bashrc"
    ".bash_profile"
    ".gitconfig"
    ".profile"
    ".tmux.conf"
    ".xinitrc"
    ".config/cmus/cmus.theme"
    ".config/compton.conf"
    ".config/dunst"
    ".config/feh"
    ".config/mpv"
    ".config/nvim"
    ".config/ranger"
    ".local/share/fonts"
)

for dotfile in "${DOTFILES[@]}";do
    rm -rf "${HOME}/${dotfile}"
    ln -sf "${DIR}/${dotfile}" "${HOME}/${dotfile}"
done

しかし、まずディレクトリを明示的に作成せずに指定した問題を解決する方法がわかりません。

答え1

GNUを使用している場合は、cp次のものを使用できます。その-s選択:

cd "${HOME}"
cp -rs "${DIR}/.*" "${DIR}/*" .

これにより、コピーするのではなく、適切なディレクトリ階層とシンボリックリンクファイルが作成されます。

関連情報