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