簡體   English   中英

如何通過*將包括隱藏文件在內的所有文件移動到父目錄中

[英]How to move all files including hidden files into parent directory via *

它一定是一個受歡迎的問題,但我找不到答案。

如何通過 * 將所有文件(包括隱藏文件)移動到父目錄,如下所示:

mv /path/subfolder/* /path/

這將像預期的那樣將所有文件移動到父目錄,但不會移動隱藏文件。 怎么做?

您可以在 UNIX 和 Linux 對如何將所有文件(包括隱藏文件)從一個目錄移動到另一個目錄的回答中找到有關此問題的全面解決方案 . 它顯示了 Bash、zsh、ksh93、標准 (POSIX) sh 等的解決方案。


您可以同時使用這兩個命令:

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files

或者一起( 感謝 pfnuesel ):

mv /path/subfolder/{.,}* /path/

其中擴展為:

mv /path/subfolder/* /path/subfolder/.* /path/

(例如: echo a{.,}b擴展為ab ab

請注意,這將顯示幾個警告:

mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory

忽略它們:發生這種情況是因為/path/subfolder/{.,}*也擴展到/path/subfolder/. /path/subfolder/.. ,它們是目錄和父目錄(參見“.”和“..”在文件夾中是什么意思? )。


如果你只想復制,你可以只使用:

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!

這將復制所有文件,包括普通文件和隱藏文件,因為/path/subfolder/. 擴展為“此目錄中的所有內容”(來源:如何使用 cp 復制以包含隱藏文件和隱藏目錄及其內容?

我認為這是最優雅的,因為它也不會嘗試移動..

mv /source/path/{.[!.],}* /destination/path

這將像預期的那樣將所有文件移動到父目錄,但不會移動隱藏文件。 怎么做?

你可以打開dotglob

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

為了關閉dotglob ,你需要說:

shopt -u dotglob

另一種更簡單的解決方案是使用rsync實用程序:

sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/

注意:上面的命令將顯示將要更改的內容。 要執行實際更改,請刪除--dry-run

優點是原始文件夾( subfolder )以及命令的一部分將被刪除,並且在此處使用mv示例時您仍然需要清理您的文件夾,更不用說額外的麻煩來覆蓋隱藏和非隱藏文件一個單一的模式。

此外rsync提供了在遠程之間復制/移動文件的支持,它可以確保文件完全按照原樣復制( -a )。

使用的-u參數會跳過現有的較新文件, -r遞歸到目錄中, -v會增加詳細程度。

通過將find命令與mv命令結合使用,您可以防止mv命令嘗試移動目錄(例如... )和子目錄。 這是一種選擇:

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;

提供的其他一些答案存在問題。 例如,以下每個都將嘗試從源路徑移動子目錄:

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/ 
3) mv /source/path/{.[!.],}* /destination/path

此外,2) 包括 . 和 .. 文件和 3) 遺漏了 ..foobar、...barfoo 等文件。

您可以使用mv /source/path/{.[!.],..?,}* /destination/path ,其中包含 3) 中遺漏的文件,但它仍會嘗試移動子目錄。 使用上面描述的find命令和mv命令可以消除所有這些問題。

讓我向您介紹我的朋友“dotglob”。 無論“*”是否包含隱藏文件,它都會打開和關閉。

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c

$ shopt -s dotglob
$ ls *
.den  .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c

它默認為“關閉”。

$ shopt dotglob
dotglob         off

最好在完成后重新打開它,否則你會混淆假設它會關閉的東西。

當我必須將所有文件(包括.文件)復制保留權限的目標目錄時,我對此問題的解決方案是:(如果已存在則覆蓋)

yes | cp -rvp /source/directory /destination/directory/

yes用於自動覆蓋目標文件, r遞歸, v詳細, p保留權限。

請注意,源路徑不以/結尾(因此所有文件/目錄和 . 文件都被復制)

目標目錄以/結尾,因為我們將源文件夾的內容作為一個整體放置到目標中。

做就是了

for I in $(ls -A dir)
do
mv dir/$I newDir
done

假設您在子文件夾中運行find . -maxdepth 1 -exec mv {} .. \\; find . -maxdepth 1 -exec mv {} .. \\;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM