如何在Linux中複製隱藏(以點開頭)檔案和子目錄?

如何在Linux中複製隱藏(以點開頭)檔案和子目錄?

如何將資料夾A中的隱藏檔案和隱藏子目錄(以點開頭的)複製到資料夾B?例如,如果我有這樣的結構:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

我想將A中的隱藏檔案和隱藏子目錄複製到B:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

我已經嘗試過這個命令:cp A/.* B來自這個另一個超級用戶問題。但是,它不會複製子目錄。也嘗試過cp -r A/.* B,但它會複製.,所以我以 A 的精確副本結束(包括普通文件)。任何幫助表示讚賞。

答案1

例如,只要您只想查找 A 層級的隱藏檔案和資料夾並且不想要

A/b/.hidden

要複製,您應該能夠使用:

cp -r A/.[^.]* B

它基本上意味著複製以 a 開頭的任何內容.,然後複製 a 以外的任何字元.過濾掉...

編輯:從 cp 命令中刪除了 -p,因為 Asker 沒有表示他想要保留任何所有權、日期等。

答案2

問題A/.*是存在也與模式相符的.目錄。A

您可以開啟擴充的 glob 模式並使用以下內容:

shopt -s extglob
cp -r A/.!(?(.)) B    

它匹配名稱以點開頭且第二個字元既不是點也不是空的文件( ?(.) 不匹配任何內容或點,!(...) 否定它,即!(?(.)) 匹配其他所有內容比沒有或一個點)。

答案3

對於這樣的情況,建議使用find代替cp像這樣:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

基本語法如下:

  • find A/ -type ffind目錄中A/類型為檔案(而非目錄)的項目...
  • -maxdepth 1 -name '.*':對於maxdepth1 個以 .name開頭的目錄.
  • -exec cp -p {} B/ \;:一旦找到這些文件,帶有標誌的命令exec將保留從來源 ( ) 到目標的日期/時間。cp-p{}B/

我喜歡使用maxdepth新增控制層,這樣我就不會意外地複製整個檔案系統。但請隨意刪除它。

答案4

作為替代方案,如果第二個字元是字母數字(來源):

cp -r A/.[a-zA-Z0-9]* B

相關內容