web-dev-qa-db-ja.com

mvが存在しない場合に移動するディレクトリを作成する方法はありますか?

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

mv foo.c ~/bar/baz/ 

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

216
Paul Wicks

このワンライナーはどうですか(bash):

mkdir --parents ./some/path/; mv yourfile.txt $_

その内訳:

mkdir --parents ./some/path

ディレクトリ(すべての中間ディレクトリを含む)を作成し、その後:

mv yourfile.txt $_

ファイルをそのディレクトリに移動します($ _は、前のシェルコマンドに渡された最後の引数、つまり、新しく作成されたディレクトリに展開されます)。

これが他のシェルでどの程度機能するかはわかりませんが、何を探すべきかについていくつかのアイデアを与えるかもしれません。

この手法を使用した例を次に示します。

$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt
238
KarstenF
mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt
54
Billmc

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

#!/bin/bash
# mv.sh
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"

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

function mv ()
{
    dir="$2"
    tmp="$2"; tmp="${tmp: -1}"
    [ "$tmp" != "/" ] && dir="$(dirname "$2")"
    [ -a "$dir" ] ||
    mkdir -p "$dir" &&
    mv "$@"
}

これらは、クリス・ルッツの提出に基づいています。

20
Sepero

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 "$@"
13
strager

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

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

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

5
Chris Lutz

答えはノーです:)。これを行うためだけにエイリアスやfuncを作成したくありません。これは1回限りで、mvコマンドを入力している最中であるためです。

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

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

4
Pat

愚かですが、動作方法:

mkdir -p $2
rmdir $2
mv $1 $2

宛先ファイル名を共有する一時ディレクトリを含むmkdir -pでディレクトリを作成し、単純なrmdirでそのファイル名ディレクトリを削除してから、ファイルを新しい宛先に移動します。ただし、dirnameを使用した回答がおそらく最善だと思います。

2
Blarn Blarnson

ブレース拡張機能を使用することもできます。

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

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

1

rsync コマンドはトリックを行うことができます宛先パスに最後のディレクトリが存在する場合のみが存在しません。 barname__は存在するがbazname__は存在しない場合、~/bar/baz/の宛先パスに対して、次のコマンドを使用できます。

rsync -av --remove-source-files foo.c ~/bar/baz/

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity
--remove-source-files   sender removes synchronized files (non-dir)

この場合、bazname__ディレクトリが存在しない場合は作成されます。ただし、barname__とbazname__の両方が存在しない場合、rsyncは失敗します。

sending incremental file list
rsync: mkdir "/root/bar/baz" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]

したがって、基本的にrsync -av --remove-source-filesmvname__のエイリアスとして使用しても安全です。

1
sepehr

私の1つの文字列ソリューション:

test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/
0
Andrey
$what=/path/to/file;
$dest=/dest/path;

mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"
0
cab404

コード:

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'
0
John Doe

コマンドを連鎖できます:mkdir ~/bar/baz | mv foo.c ~/bar/baz/
またはシェルスクリプトは次のとおりです。

#!/bin/bash
mkdir $2 | mv $1 $2

1.開く テキストエディター
2.コピーアンドペースト シェルスクリプト。
3.保存 それとして mkdir_mv.sh
4.入力 スクリプトのディレクトリ:cd your/script/directory
5.ファイルモードの変更 :chmod +x mkdir_mv.sh
6.セット エイリアスalias mv="./mkdir_mv.sh"
現在、コマンドmvを実行すると、移動ディレクトリが存在しない場合は作成されます。

0
Sharofiddin
((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))
0
svaardt