天天看點

linux mv 目錄不存在,linux - 有沒有辦法讓mv建立要移動的目錄,如果它不存在?...

linux - 有沒有辦法讓mv建立要移動的目錄,如果它不存在?

是以,如果我在我的主目錄中并且我想将foo.c移動到〜/ bar / baz / foo.c,但那些目錄不存在,是否有某種方法可以自動建立這些目錄,以便 你隻需輸入

mv foo.c ~/bar/baz/

一切都會成功嗎? 看起來你可以将mv改為一個簡單的bash腳本,它會檢查這些目錄是否存在,如果不存在則會調用mkdir然後調用mv,但我想我會檢查是否有人有更好的想法。

12個解決方案

215 votes

這個單行(在bash中)怎麼樣:

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

打破這種情況:

mkdir --parents ./some/path

建立目錄(包括所有中間目錄),之後:

mv yourfile.txt $_

将檔案移動到該目錄($ _展開到傳遞給前一個shell指令的最後一個參數,即:新建立的目錄)。

我不确定這在其他炮彈中會有多大作用,但它可能會給你一些關于要尋找什麼的想法。

以下是使用此技術的示例:

$ > ls

$ > touch yourfile.txt

$ > ls

yourfile.txt

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

$ > ls -F

some/

$ > ls some/path/

yourfile.txt

KarstenF answered 2019-03-11T11:39:21Z

47 votes

mkdir -p `dirname /destination/moved_file_name.txt`

mv /full/path/the/file.txt /destination/moved_file_name.txt

Billmc answered 2019-03-11T11:39:38Z

19 votes

儲存為名為mv或mv.sh的腳本

#!/bin/bash

# mv.sh

dir="$2"

tmp="$2"; tmp="${tmp: -1}"

[ "$tmp" != "/" ] && dir="$(dirname "$2")"

[ -a "$dir" ] ||

mkdir -p "$dir" &&

mv "[email protected]"

或者放在〜/ .bashrc檔案的末尾,作為替換每個新終端上的預設mv的函數。 使用函數允許bash保持記憶體,而不是每次都必須讀取腳本檔案。

function mv ()

{

dir="$2"

tmp="$2"; tmp="${tmp: -1}"

[ "$tmp" != "/" ] && dir="$(dirname "$2")"

[ -a "$dir" ] ||

mkdir -p "$dir" &&

mv "[email protected]"

}

這些基于Chris Lutz的送出。

Sepero answered 2019-03-11T11:40:17Z

12 votes

你可以使用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 "[email protected]"

strager answered 2019-03-11T11:40:50Z

5 votes

可能是以下shell腳本?

#!/bin/sh

if [[ -e $1 ]]

then

if [[ ! -d $2 ]]

then

mkdir --parents $2

fi

fi

mv $1 $2

這是基本的部分。 您可能希望添加一些内容來檢查參數,如果目标存在,或者源目錄存在,或者不存在(或者不覆寫不存在的内容),您可能希望更改行為。

Chris Lutz answered 2019-03-11T11:41:24Z

3 votes

這聽起來像答案是沒有:)。 我真的不想建立一個别名或func隻是為了這樣做,通常是因為它是一次性的,我已經在鍵入mv指令的中間,但我發現了一些适用于此的東西:

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

如果mv失敗(dir不存在),它将生成目錄(這是上一個指令的最後一個參數,是以$_具有該目錄)。 是以隻需運作此指令,然後重新運作它,這次mv應該會成功。

Pat answered 2019-03-11T11:41:58Z

2 votes

Sillier,但工作方式:

mkdir -p $2

rmdir $2

mv $1 $2

使用mkdir -p建立包含共享目标檔案名的臨時目錄的目錄,然後使用簡單的rmdir删除該檔案名目錄,然後将檔案移動到新目标。我認為使用dirname的答案可能是最好的。

Blarn Blarnson answered 2019-03-11T11:42:33Z

2 votes

最簡單的方法是:mkdir [directorie name] && mv [filename] $_

假設我下載下傳了位于我的下載下傳directorie中的pdf檔案(〜/ download),我想在一個沒有退出的導演中移動所有檔案(讓我們說“my_PDF”)。

我将輸入以下指令(確定我目前的工作目錄os~ / download):

mkdir my_PDF && mv *.pdf $_

如果你想像這樣建立子目錄,你可以向mkdir添加-p選項:(假設我想建立一個名為“python”的子目錄):

mkdir -p my_PDF/python && mv *.pdf $_

Abdoul Seibou answered 2019-03-11T11:43:24Z

1 votes

你甚至可以使用大括号擴充:

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}

它建立了3個目錄(directory1,directory2,directory3),在每個子目錄中都有兩個子目錄(子目錄1,子目錄2),并且在每個子目錄中有兩個子子目錄(subsubdirectory1和subsubdirectory2)。

你必須使用bash 3.0或更新版本。

Stefan Gruenwald answered 2019-03-11T11:44:20Z

0 votes

$what=/path/to/file;

$dest=/dest/path;

mkdir -p "$(dirname "$dest")";

mv "$what" "$dest"

cab404 answered 2019-03-11T11:44:39Z

0 votes

我的一個解決方案:

test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/

Andrey answered 2019-03-11T11:45:04Z

0 votes

碼:

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'

John Doe answered 2019-03-11T11:45:33Z