На этот вопрос уже есть ответ здесь:
Я хочу скопировать определенную папку из одной точки в другую, и у меня есть более 300 папок назначения, куда я хочу скопировать эту конкретную папку. Может ли кто-нибудь помочь мне с правильным решением? Было бы здорово, если бы вы предложили сценарий оболочки.
Принятие Вашей первой папки называют foo
, и Вы хотите скопировать его в каталоги, которые указаны в destinations.txt
(один на строку).
Вы могли использовать for
- цикл для этого:
for i in $(cat destinations.txt)
do
echo "$i" #prints the name of the current target -> you can see progress, if it takes long
cp -R foo/ "$i"
done
Ядро функции я имею в моем .bashrc
поскольку это - это:
echo $destinations | xargs -n 1 cp $sourcefile
(Я думаю, что получил это из этого ответа), Если места назначения находятся в destinations.txt
, просто замена echo $destinations
с cat destinations.txt
Имена файлов с пробелами дадут, Вы выходите, если они не заключаются в кавычки во входе, так опасаться этого.
Вот полная функция от моего .bashrc
. Вероятно, не очень устойчивый, поскольку мои варианты использования были просты и я не хотел тратить долго на него, не ожидайте, что это обработает более странные имена файлов очень корректно.
function distribute {
arguments=""
destinations=""
sourcefile=""
while [[ $# -ge 1 ]]; do
key="$1"
if [[ "$key" == "-h" ]]; then
echo "usage: $0 [flags to cp] source_file destination_1 [... destination_N]"
elif [[ "$key" == -* ]]; then
arguments+=" $key"
elif [ -z "$sourcefile" ]; then
sourcefile="$key"
else
destinations+=" $key"
fi
shift
done
echo $destinations | xargs -n 1 cp $arguments $sourcefile
}
Я предложил бы использовать while ... do
цикл
while read -r d; do
cp -R -- foo/ "$d"
done < destinations.txt
<час> , С другой стороны, использование xargs
xargs -n1 -a destinations.txt cp -R foo --
cp -r sourceFolder {destination1,destination2,destination14}