題 如何將所有文件從當前目錄移動到上層目錄?


如何將所有文件從當前目錄移動到linux中的上層目錄?

我嘗試過類似的東西 mv *.*,但它不起作用。


126
2017-10-28 18:54


起源


我沒有足夠的代表來重複問題,但我可以建議 [linux] [mv] [cwd] [files]或類似的東西? - Stephan202
我根據Stephan202的要求重新提出了這個問題。 - eleven81
unix.stackexchange.com/a/251091/139312 - palindrom


答案:


您正在尋找的命令是

mv * .[^.]* ..

或(見下文了解更多信息):

(shopt -s dotglob; mv -- * ..)

說明: mv 命令移動文件和目錄。最後一個參數 mv 是目標(在這種情況下,目錄在樹中“向上”一步, ..)。之前的參數是源文件和目錄。星號(*)是一個通配符,匹配所有不以點開頭的文件。以點(dotfiles)開頭的文件是“隱藏的”。使用該模式匹配它們 .[^.]* (見下面的編輯)。

有關詳細信息,請參閱我鏈接的聯機幫助頁 mv


為什麼 .[^.]* 代替 .* ?

克里斯約翰森 正確指出:模式 .* 也匹配 . 和 ..。既然你不想(也不能)移動那些,最好使用匹配任何以點開頭的文件名的模式 除了那兩個。模式 .[^.]* 這樣做:它匹配任何文件名(1)以點(2)開頭,後跟一個字符  點(3)後跟零個或多個任意字符。

Paggas  指出,我們還必須添加模式 .??* 為了匹配以兩個點開頭的文件。請參閱他對使用替代解決方案的回答 find

阿爾揚的 回答 提到 shopt 為了避免dotfiles的所有問題。但是,以破折號開頭的文件仍然存在問題。它需要三個命令。不過,我喜歡這個主意。我建議像這樣使用它:

(shopt -s dotglob; mv -- * ..)

這執行 shopt 在子shell中(因此沒有第二次調用 shopt 要求)和用途 -- 所以以破折號開頭的文件不會被解釋為參數 mv


194
2017-10-28 19:01



運用 .* 可能會導致 MV 產生關於無法移動的警告/錯誤 . 和 ..。你可以試試 mv * .[^.]* .. 代替。 - Chris Johnsen
非常完整的回答謝謝。
@alain:不客氣,歡迎來到網站! (如果(且僅當)其中一個帖子足以回答您的問題,那麼您可以將其標記為。這將為海報增加15個額外的聲望點,並且還會給你2個額外的代表。) - Stephan202
*。*語法沒有任何害處 - 包括..只有在與chmod和chown一起使用時才有危險,並且“recurse”標誌,即chmod -R或chown -R。在那些情況下,永遠不要 曾經 type chown。*或chmod。* - chown你正在尋找的路徑中的頂級目錄並使用-h(不要遵循符號鏈接)。但是,mv ..根本不做任何事情所以不要擔心它。 - chris
正確的三種模式是 *, .[^.]* 和 ..?*。第二個可能 .[!.]* 對於舊的(POSIX)shell。 還看了


簡答:使用

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

答案很長:

命令

mv * .* ..

從那以後就行不通了 .* 可以匹配 . 和 ..。但是命令

mv * .[^.]* ..

從那以後也行不通 .[^.]* 將不匹配,例如, ..filename!相反,我所做的是

mv * .[^.] .??* ..

這將匹配除了之外的一切 . 和 ..* 將匹配所有不以a開頭的內容 ..[^.] 將匹配以點開頭的所有2個字符文件名除外 ..,和 .??* 將匹配所有以至少包含3個字符的點開頭的文件名。

更好的是,你可以使用

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

這避免了醜陋的全球黑客攻擊 mv * .[^.] .??* ..


42
2017-10-28 20:19



此外,我忘了注意 - 的重要性 - 這樣命令可以正確使用以破折號開頭的文件名。我已經把 - 包括在我的答案中。使用globs的更完整的答案是“mv - *。[^。]。?? * ..”。 - Paggas
+1:我回來補充說 ..?* 我的評論,你已經照顧好了。 - Chris Johnsen
嘗試mv可能有什麼問題?它什麼都不做,什麼也做不了。它還有其他命令 能夠 做某事(chmod和chown),但mv和rm根本不做任何事情。要么 .. - chris
這給了mv:非法選項 - t - pal4life
波諾,雙破折號告訴我 mv 停止尋找任何進一步的命令選項。大括號是生成的文件名。加號表示不是每個結果運行exec(即每個文件名),而是將盡可能多的結果放在單個exec中。為了完整, -t.. 告訴移動目標目的地將所有這些文件移動到。 - isuldor


為了完整起見,我們還可以告訴Bash shell包含隱藏文件 shopt

shopt -s dotglob
mv -- * ..
shopt -u dotglob

14
2017-10-28 20:52



+1。更清潔。不過,我認為略有改善。請參閱我的回答更新。 - Stephan202


mv缺乏使用時移動隱藏文件的功能 *  - 那麼為什麼不使用複制呢?

cp -rf . ..

rm -rf *

無需進入dotglobbing和使用find命令的複雜解決方案。


8
2017-08-02 20:46



警告 如果你正在搬進去 相同的文件系統,在大多數情況下,您沒有真正複製文件,只是更新目錄條目而不移動inode或文件競爭對手。甚至看到 [1]。有了 cp 和 rm 相反,你真的是在復制所有。 - Hastur


rsync -a --remove-source-files . ..

rsync 是一個非常強大的文件複製工具,通常用於執行高效的增量遠程備份和鏡像。

用上面的命令,我們告訴你 rsync 複製內容 . 成 ..

開關 -a 使遞歸成為可能 . 子目錄並啟用一些其他常見選項。

開關 --remove-source-files 告訴rsync在成功複製後刪除源文件,即它使rsync的行為類似於 mv 命令。


6
2018-01-20 11:47



多一點解釋會很好。 - ChrisF
當然,希望現在更清楚了。 - mrucci
注意 --remove-source-files 不會刪除(同步)目錄。 - Dennis
很好,接受的解決方案給了我 -bash: /bin/mv: Argument list too long 錯誤。這個就像魅力一樣。 - userlond


最終嘗試 mv . 將失敗,因為mv將無法取消您當前所在目錄的鏈接。您可以 mv * .. 移動cwd中的文件。


2
2017-10-28 18:59



嗨,謝謝你的工作!


mv * .??* ../.

* 獲取所有非點文件。 .??* 得到所有。文件長度至少為三個字節,適用於所有合法的文件。你可能想要的任何東西 rm 而不是 mv 無論如何。

../. 不提供任何直接的好處 .. 但是當進行一個移動到目錄時,這是一個非常好的習慣,因為它會失敗,如果你想要,如果路徑有問題。例如, mv xyz bletch,你在哪裡 認為  bletch 是一個目錄,可以更加確定 mv xyz bletch/.


2
2017-10-28 19:47



你可以補充一下 .[^.] 得到像這樣的封面文件 .a。 - Chris Johnsen
../和../之間沒有區別。所以我不打擾打字。在斜線之後。此外,在mv和rm的情況下,包含也沒有壞處。和...在列表中,即mv *。* / path / to / file /沒有任何可怕或錯誤,就像rm一樣。甚至-rf。沒有做任何事。 - chris


這個最小化的命令適用於大多數現代shell:

\mv -- {,.{[^.],??}}* ..

另外提到的是便攜式解決方案:

\mv -- * .[^.] .??* ..

特徵:

  1. 防止別名不期望地改變mv。

  2. - 防止包含前導連字符(-xyz)的文件名被解釋為命令行參數。

  3. 。[^。]匹配以...開頭的所有兩個字符文件名。除了 ..

  4. 。?? *匹配所有其他文件名三個字符或更長的字符。

樸素的實施:

  1. 以下內容跳過隱藏的UNIX文件名,即開頭的文件名。 (.bashrc)中。

    mv * ..
    
  2. 以下匹配..以遞歸方式嘗試將每個目錄最終一直移回當前工作目錄($ PWD或pwd)。 永遠不要用。

    mv .* ..
    

2
2017-08-12 08:12





使用該模式更為正確 * .[!.] .??* 比 * .[^.] .??* 因為前者也可以使用舊的shell,例如ksh88:

mv -- * .[!.] .??* ..
  • -- 當您有一個以。開頭的文件名時,可以防止出現問題 -
  • * 匹配所有不以a開頭的文件名 .
  • 沒有一個以a開頭的字符文件名 . 你可以/應該移動
  • .[!.] 匹配以a開頭的所有兩個字符文件名 .
  • .??* 匹配以a開頭的所有三個字符文件名(或更長) .

用ksh88,文件名模式 .[^.] 實際上會匹配文件名 .. (總是存在)和 .^ (可能不存在),具有與期望相反的效果。


2
2017-10-22 22:24