dir1,dir2,dir3,dir4
我在 Linux 機器上有多個目錄 { }。
每個目錄中有多個檔案(具有相同的副檔名,例如 .zip),我想備份到相應的目錄 { dir1-bck,dir2-bck,dir3-bck,dir4-bck
}。我不需要備份整個資料夾,只需備份每個資料夾中的幾個檔案。
dir1/*.zip
我將如何從drop in複製檔案dir1-bck
。 。 。取得提供的目錄清單。我目前正在使用:
cp -r src/dir1/*.zip dest/dir1-bck/
cp -r src/dir2/*.zip dest/dir2-bck/
cp -r src/dir3/*.zip dest/dir3-bck/
cp -r src/dir4/*.zip dest/dir4-bck/
這是可行的,但還有很大的進步空間。
查看xargs
手冊頁和論壇上的類似帖子,我覺得它是完成這項工作的工具,但我似乎無法正確使用它。
答案1
也許for
循環就可以了。確切的形式取決於這些目錄的命名方式。有可能:
cd src || exit 1
for d in "dir"{1..4}; do
cp -r "$d"/*.zip "../dest/$d-bck/"
done
筆記:
- 最好從
src
(cd src
) 內部工作,因此該變數包含一個可以在目標路徑中使用的字串,無需額外處理。在這種情況下,目標路徑是透過前置進行調整的../
,但一般情況下它可能是這樣的"/full/path/to/dest/$d-bck/"
。 - 我引用了
dir
以防您用空格等替換名稱。我$d
出於同樣的原因雙引號更多的。 - 如果
*.zip
是文件,那麼您不需要-r
.
或者該for
行可能是:
for d in dir1 dir2 dir3 dir4; do
如果您需要指定幾個任意命名的目錄,這將很有用。甚至:
for d in *; do
可以進行一些改進,例如:
( cd src || exit 1
for d in *; do
dst="../dest/$d-bck/"
[ -d "$d" ] && mkdir -p "$dst" && cp -- "$d"/*.zip "$dst"
done )
改進之處:
- 所有程式碼都在子 shell (
(…)
) 中運行,因此cd
即使將程式碼貼到終端機中也不會影響目前 shell。如果它必須是一個獨立的腳本(執行,而不是獲取),那麼子 shell 將是無關緊要的。 - 我們檢查是否
$d
為目錄。 - 我們嘗試建立目標目錄(如果它不存在)。
cp
只有當目標目錄存在時我們才會繼續。- 我們用雙破折號如果
$d
以破折號開頭。
可能出現的問題:
"$d"/*.zip
可能會擴展到太多項目 (Argument list too long
)。您原來的命令也以同樣的方式「有缺陷」。如果「每個」目錄中只有幾個文件,那麼這應該不是問題。"$d"/*.zip
可能不會擴展(*
將保持字面意思)。它應該沒有什麼害處,仍然會預先建立目標目錄。在這種情況下,可能需要額外的邏輯來抑制目錄建立。- 整個片段的退出狀態只取決於最後一個
[ … && mkdir … && cp …
。您需要額外的邏輯來使早期的問題影響退出狀態。