將多個檔案複製到多個目錄

將多個檔案複製到多個目錄

我在複製不同目錄中的許多文件時遇到問題。讓我更好地解釋:

假設我的目錄中有以下內容:

$ ls
file1 file2 file3 file4 file5 dir1 dir2 dir3

我想用一個指令複製每個目錄*中的每個檔案*。我嘗試過:

 echo dir{1..3} | xargs cp file{1..5} '{}' \;

我的目的是告訴 xargs 處理 echo 中的每個 dir* 並複製處理的輸入中的所有文件,但此方法和類似方法不起作用。我想避免使用腳本,因為這是我必須對大約 20 個目錄重複的任務,而且檔案的名稱略有不同,所以我更喜歡修改命令而不是腳本。

答案1

echo dir[1-3] | xargs -r -n1 cp file[1-5]

答案2

您在使用 xargs 時犯了一個小錯誤。如果沒有 -n 參數,xargs 將輸入中的所有參數附加到命令中,並且echo dir{1..3}不會在每個條目之間添加必要的回車符,因此 xargs 會將結果視為一個參數。

xargs 有一個選項 -n 可以限制條目數量,您需要使用 \n 或 \0 作為分隔符號列出目錄:

find . -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 -n 1 cp file{1..5}

find 指令將尋找目前目錄中的所有目錄,並使用\0 作為分隔符號(如果目錄有空格,則效果更好),而xargs 使用\0 作為分隔符,每次僅使用1 個參數啟動該指令。

答案3

如果它們確實有這樣的名稱,則類似以下內容應該有效:

#!/bin/bash
shopt -s nullglob
for dir in dir*/; do
    cp file* "$dir"
done

如果要將所有檔案複製到所有目錄(無論名稱為何):

#!/bin/bash
shopt -s nullglob dotglob
for dir in */; do
    for file in *; do
        [[ -f $file ]] && cp "$file" "$dir"
    done
done

答案4

你快到了。您需要cp為每個目標目錄執行單獨的命令,因為cp只為每個來源檔案建立一份副本。的主要目的xargs是透過多個參數來執行一個命令,但您可以使用該選項告訴它一次傳遞一個項目-n。也是;{} ;的語法find … -exec你不需要(也不能使用)它與xargs.

echo dir{1..3} | xargs -n 1 cp file{1..5}

請注意,只有當您的目錄名稱不包含任何空格或任何字元時\'",這才有效,因為xargs無法判斷這些字元是檔案名稱的一部分,並且無法引用和分隔輸入檔案。不存在任何此類問題的另一種方法是使用 shell 循環:

for d in dirs{1..3}; do
  cp file{1..5} "$d"
done

所有這些都假設您可以透過名稱輕鬆區分文件和目錄。如果不能,可以透過/在末尾添加a來匹配目錄;例如符合*/目前目錄中的所有目錄,foo[0-9]*/符合名稱以foo數字開頭的所有目錄等。cp遞歸複製,目錄將被忽略並顯示錯誤訊息。

for d in */; do
  cp * "$d"
done

在 zsh 中,您可以使用全域限定符僅符合某些文件類型。

for d in *(/); do
  cp *(.) $d
done

相關內容