bash從多個目錄複製檔案到多個對應的備份目錄

bash從多個目錄複製檔案到多個對應的備份目錄

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 …。您需要額外的邏輯來使早期的問題影響退出狀態。

相關內容