題 如何用cp複製包含隱藏文件和隱藏目錄及其內容?


我該怎麼做 cp -r 複製 絕對都是 目錄中的文件和目錄

要求:

  • 包括隱藏文件和隱藏目錄。
  • 是一個帶有標誌的命令,包含上述內容。
  • 根本不需要依賴模式匹配。

我的醜陋,但工作,黑客是:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

如何在沒有模式匹配的情況下在一個命令中完成所有操作? 我需要使用什麼旗幟?


313
2017-10-27 19:46


起源


這裡有更多的答案,雖然看起來不那麼好; serverfault.com/questions/3154/... - Roel Van de Paar
請Eleven81考慮更改@bruno pereira給出的答案,因為它避免了創建新文件夾。如果沒有,請將此評論作為對新讀者的警告,以檢查其他(投票最多的)答案。 TX。 - Dr Beco


答案:


不要指定文件:

cp -r /etc/skel /home/user

(注意 /home/user 必須不存在,否則它會創建 /home/user/skel。)


226
2017-10-27 19:55



是否可以使用類似的東西 /home/user/skel  不 存在? - bradley.ayers
@ bradley.ayers我認為可以復製到一個臨時子目錄然後將它們移動到較高級別(因為在同一個驅動器中移動速度很快)。不太理想,但比其他解決方案更短。 - Halil Özgür
@ bradley.ayers布魯諾的回答如下,解決了你的問題 - Mark
這個解決方案對我不起作用。它沒有復制隱藏文件。我正在使用CentOS 6.5版。 @ Bruno的解決方案就是這樣做的。 - Technext
在ubuntu / debian下,這將目錄'skel'放在目標目錄中,而不是skel中的遞歸文件。使用 -T (無目標)以下正確使用。 (-rT 用於遞歸) - bshea


假設您創建了新文件夾(或將要創建一個),並希望在創建文件夾後將文件複製到該文件夾

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

這將從中遞歸複製所有文件/文件夾 /etc/skel 在第一行創建的現有文件夾中。


396
2017-12-12 22:00



如果我沒有弄錯,這並沒有復制隱藏/點文件。 - Halil Özgür
對我來說效果很好。注意'。'對它起作用至關重要。 - Mark
它有效,但為什麼呢?在手冊中找不到對此的引用。 - Julien Palard
我認為它有效,因為通常情況下,這將創建一個新文件夾,其中包含第一個參數中最後一個文件夾的名稱。但是,因為那個名字是 .,這種行為需要它創建一個已經存在的目錄,所以它只是跳過該步驟。 - Zenexer
@Technext bash中的默認globbing不包含以a開頭的文件名 .,改變你需要使用的 shopt -s dotglob 命令之前能夠包含這些文件。所以 *,默認情況下,您要求從此目錄遞歸複製所有可以使用擴展的文件 * (默認情況下不包含隱藏文件)。而在另一端則 . 您正在使用cp遞歸複製“此目錄”中的所​​有內容。 - Bruno Pereira


bash 本身有一個很好的解決方案,它有一個 shell option, 您可以 cpmv 等等。:

shopt -s dotglob # for considering dot files (turn on dot files)

shopt -u dotglob # for don't considering dot files (turn off dot files)

以上解決方案是標準的 bash

注意:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

61
2018-02-06 01:14



當您只想複製內容而不在目標內創建新目錄時,這很有用。特別是當目標目錄是掛載點時。 - kaszynek
這真的是最好的答案,並深入到問題的核心.. - Stephen
它的 setopt 對於zsh,以防其他人想知道。 - Pat


這樣做的正確方法是使用 -T (--no-target-directory) 選項,並遞歸複製文件夾(沒有尾隨斜杠,星號等),即:

cp -rT /etc/skel /home/user

這將復制內容 /etc/skel 至 /home/user (包括隱藏文件),創建文件夾 /home/user 如果它不存在;然而 -T 選項可以防止內容 /etc/skel 從被複製到新文件夾 /home/user/skel 應該是文件夾 /home/user 存在。


53
2017-09-08 21:50



正確答案。 +1 - bshea
這確實是正確的答案 - Gaetan
這是最好的答案;它是唯一一個解決問題而不會使問題複雜化的問題 - ZaxLofful


使用rsync:

rsync -rtv source_folder/ destination_folder/


23
2018-02-20 13:18





如果源目錄和目標目錄具有相同的名稱,即使目標目錄存在,您只需鍵入:

cp -R /etc/skel /home/

這會將/ etc / skel目錄複製到/ home /,包括隱藏文件和目錄。

最後,您可以復制目錄並將其重命名為一行:

cp -R /etc/skel /home/ && mv /home/skel /home/user

3
2018-05-16 08:38



或者你可以簡單地使用 cp -r /etc/skel /home/user 用於重命名 skel 至 user... - David
這是正確的,只有當/ home / user還不存在時。 - Gabriel Hautclocq


rsync 很好,但另一種選擇:

cp -a src/ dst/

從主要幫助:

   -a, --archive
          same as -dR --preserve=all

   -d     same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively

2
2017-08-28 17:46



我總是用cp -r。謝謝你提到cp -a - Pinaki Mukherjee