338

したがって、ホームディレクトリにいて、 foo.c を ~/bar/baz/foo.c に移動したいが、それらのディレクトリが存在しない場合、それらのディレクトリを自動的に作成する方法はありますか?入力するだけで済みます

mv foo.c ~/bar/baz/ 

そしてすべてがうまくいくでしょうか?これらのディレクトリが存在するかどうかを確認し、存在しない場合は mkdir を呼び出してから mv を呼び出す単純な bash スクリプトに mv をエイリアスできるようですが、誰かがより良いアイデアを持っているかどうかを確認すると思いました。

4

19 に答える 19

73
mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt
于 2012-06-21T19:19:06.370 に答える
26

mv.sh という名前のスクリプトとして保存します

#!/bin/bash
# mv.sh
dir="$2" # Include a / at the end to indicate directory (not filename)
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"

または、 ~/.bashrc ファイルの最後に、新しい端末ごとにデフォルトの mv を置き換える関数として配置します。関数を使用すると、毎回スクリプト ファイルを読み取る代わりに、bash がメモリを保持できます。

function mvp ()
{
    dir="$2" # Include a / at the end to indicate directory (not filename)
    tmp="$2"; tmp="${tmp: -1}"
    [ "$tmp" != "/" ] && dir="$(dirname "$2")"
    [ -a "$dir" ] ||
    mkdir -p "$dir" &&
    mv "$@"
}

使用例:

mv.sh file ~/Download/some/new/path/ # <-End with slash

これらは Chris Lutz の投稿に基づいています。

于 2012-04-26T03:54:05.923 に答える
14

使用できますmkdir

mkdir -p ~/bar/baz/ && \
mv foo.c ~/bar/baz/

自動的に実行する簡単なスクリプト (未テスト):

#!/bin/sh

# Grab the last argument (argument number $#)    
eval LAST_ARG=\$$#

# Strip the filename (if it exists) from the destination, getting the directory
DIR_NAME=`echo $2 | sed -e 's_/[^/]*$__'`

# Move to the directory, making the directory if necessary
mkdir -p "$DIR_NAME" || exit
mv "$@"
于 2009-02-13T21:18:44.997 に答える
10

答えはノーのようです:)。これを行うためだけにエイリアスや関数を作成したくはありません。多くの場合、それは 1 回限りであり、既にmvコマンドを入力している途中ですが、そのためにうまく機能するものを見つけました。

mv *.sh  shell_files/also_with_subdir/ || mkdir -p $_

失敗した場合mv(dir が存在しない場合)、ディレクトリを作成します (これは前のコマンドの最後の引数であり、そのようになっ$_ています)。したがって、このコマンドをup実行してから再実行すると、今度mvは成功するはずです。

于 2016-03-14T19:12:25.050 に答える
4

おそらく、次のシェルスクリプトですか?

#!/bin/sh
if [[ -e $1 ]]
then
  if [[ ! -d $2 ]]
  then
    mkdir --parents $2
  fi
fi
mv $1 $2

それが基本的な部分です。引数をチェックするために少し追加したいかもしれませんし、宛先が存在する場合、またはソースディレクトリが存在する場合、または存在しない場合に動作を変更したい場合があります (つまり、存在しないものを上書きしないでください)。 .

于 2009-02-13T21:21:10.077 に答える
1

コード:

if [[ -e $1 && ! -e $2 ]]; then
   mkdir --parents --verbose -- "$(dirname -- "$2")"
fi
mv --verbose -- "$1" "$2"

例:

引数: "d1" "d2/sub"

mkdir: created directory 'd2'
renamed 'd1' -> 'd2/sub'
于 2018-06-30T12:45:04.373 に答える
1

ファイルを新しいサブディレクトリに一括移動しているときに、この問題に遭遇することがよくあります。理想的には、私はこれをしたい:

mv * newdir/  

このスレッドのほとんどの回答はmkdir、次にmvを提案していますが、結果は次のようになります。

mkdir newdir && mv * newdir 
mv: cannot move 'newdir/' to a subdirectory of itself

私が直面している問題は、すべてを一括して移動したいという点で少し異なります。また、移動する前に新しいディレクトリを作成すると、新しいディレクトリをそれ自体に移動しようとします。したがって、親ディレクトリを使用してこれを回避します。

mkdir ../newdir && mv * ../newdir && mv ../newdir .

注意: ルート フォルダ ( ) では機能しません/

于 2020-11-02T13:04:25.427 に答える
-1
$what=/path/to/file;
$dest=/dest/path;

mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"
于 2016-06-30T01:24:39.327 に答える
-1

ブレース エクステンションを使用することもできます。

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}      
  • 3 つのディレクトリ (directory1、directory2、directory3) を作成します。
    • それぞれに 2 つのサブディレクトリ (サブディレクトリ 1、サブディレクトリ 2)、
      • それぞれに 2 つのサブサブディレクトリ (subsubdirectory1 と subsubdirectory2) があります。

bash 3.0 以降を使用する必要があります。

于 2011-04-01T05:11:06.900 に答える