したがって、ホームディレクトリにいてfoo.cを〜/ bar/baz/foo.cに移動したいが、それらのディレクトリが存在しない場合、それらのディレクトリを自動的に作成する方法があります。あなただけを入力する必要があります
mv foo.c ~/bar/baz/
そして、すべてがうまくいくでしょうか?これらのディレクトリが存在するかどうかを確認し、mkdirを呼び出してからmvを呼び出す単純なbashスクリプトにmvをエイリアスできるように思えますが、誰かがより良いアイデアを持っているかどうかを確認したいと思いました。
このワンライナーはどうですか(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
mkdir -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt
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 "$@"
}
これらは、クリス・ルッツの提出に基づいています。
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 "$@"
次のシェルスクリプト、おそらく?
#!/bin/sh
if [[ -e $1 ]]
then
if [[ ! -d $2 ]]
then
mkdir --parents $2
fi
fi
mv $1 $2
それが基本的な部分です。引数をチェックするために少し追加したい場合があります。また、宛先が存在する場合、ソースディレクトリが存在する場合、または存在しない場合(つまり、存在しないものを上書きしない場合)に動作を変更したい場合があります。
答えはノーです:)。これを行うためだけにエイリアスやfuncを作成したくありません。これは1回限りで、mv
コマンドを入力している最中であるためです。
mv *.sh Shell_files/also_with_subdir/ || mkdir -p $_
mv
が失敗する(dirが存在しない)場合、ディレクトリが作成されます(前のコマンドの最後の引数であるため、$_
にあります)。したがって、このコマンドを実行してから、 up 再実行すると、mv
が成功するはずです。
愚かですが、動作方法:
mkdir -p $2
rmdir $2
mv $1 $2
宛先ファイル名を共有する一時ディレクトリを含むmkdir -pでディレクトリを作成し、単純なrmdirでそのファイル名ディレクトリを削除してから、ファイルを新しい宛先に移動します。ただし、dirnameを使用した回答がおそらく最善だと思います。
ブレース拡張機能を使用することもできます。
mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
Bash 3.0以降を使用する必要があります。
rsync コマンドはトリックを行うことができます宛先パスに最後のディレクトリが存在する場合のみが存在しません。 bar
name__は存在するがbaz
name__は存在しない場合、~/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)
この場合、baz
name__ディレクトリが存在しない場合は作成されます。ただし、bar
name__とbaz
name__の両方が存在しない場合、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-files
をmv
name__のエイリアスとして使用しても安全です。
私の1つの文字列ソリューション:
test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/
$what=/path/to/file;
$dest=/dest/path;
mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"
コード:
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'
コマンドを連鎖できます: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
を実行すると、移動ディレクトリが存在しない場合は作成されます。
((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))