Копирование всех файлов от одного каталога до всех каталогов в соответствии с тем же родительским каталогом

Как предложено в комментариях, Вы могли также использовать inotify хотя это - излишество. Безусловно самое простое должно использовать watch. Вот один способ сделать это с inotify:

  1. Установите inotify-tools пакет

    sudo apt-get install inotify-tools
    
  2. Использовать inotifywatch проверять Ваш файл на изменения. Выполните его в цикле и cat файл, если изменение обнаруживается (вот почему я grep для строки total):

    while true; do 
      inotifywatch -e modify -t 1 kk 2>/dev/null | grep -q total && 
      echo "$(date;cat kk)"; 
    done
    
3
22.08.2014, 03:09
3 ответа

Если я понимаю, что вам нужно, самый простой способ - это цикл for:

myList="server1 server2 server4 server5 server6 server7 server8 server9 server10"
for myDir in $myList ; do cp server3/* $myDir/ ; done
1
27.01.2020, 21:23

cp может обрабатывать несколько источников, но не может обрабатывать несколько адресатов.

Вы можете использовать echo dir1 dir2 dir3 | xargs -n 1 cp file1 это скопирует, например, file1 в dir1 , dir2 и dir3 .

Другая модификация - echo dir1 dir2 dir3 | xargs -n 1 cp / home / test / server3 / * , который скопирует все файлы из указанного каталога в отображаемые каталоги.

Дополнительное решение, которое немного короче (без необходимости вводить имена каталогов):

ls -1 | grep -v server3 | xargs -n 1 cp server3 / *

Наконец, похоже на дубликат

Пример добавления для первого решения:

# creating sample dir structure
[shadowe@shadow Desktop]$ mkdir server1
[shadowe@shadow Desktop]$ mkdir server2
[shadowe@shadow Desktop]$ mkdir server3
[shadowe@shadow Desktop]$ touch server3/test.one
[shadowe@shadow Desktop]$ touch server3/test.two
[shadowe@shadow Desktop]$ ls -R
./server1:
./server2:
./server3:
test.one  test.two

# executing solution
$ echo /home/shadowe/Desktop/server2/ /home/shadowe/Desktop/server1/ | xargs -n 1 cp /home/shadowe/Desktop/server3/*

# verifying solution
[shadowe@shadow Desktop]$ ls -R
./server1:
test.one  test.two
./server2:
test.one  test.two
./server3:
test.one  test.two

Пример добавления для второго решения:

# showing directories structure and initial state
$ ls -R
server1:
server2:
server3:
test.one  test.two
server4:
server5:
server6:

# executing command
$ ls -1 | grep -v server3 | xargs -n 1 cp server3/*

# checking results
$ ls -R
./server1:
test.one  test.two
./server2:
test.one  test.two
./server3:
test.one  test.two
./server4:
test.one  test.two
./server5:
test.one  test.two
./server6:
test.one  test.two

Как видно, обе команды скопировали все файлы в server3 в другие каталоги, так что это вопрос предпочтений и варианта использования.

1
27.01.2020, 21:23

Самый простой способ сделать это за один цикл:

for i in ./server*; do cp ./server3/testfile* "${i}"; done

Он скопирует содержимое каталога server3 в каждый каталог по текущему пути. Это также попытается скопировать файлы в тот же самый каталог, но только распечатает, что это те же самые файлы и продолжит.

Редактирование:. Чтобы избежать неприятных сообщений об ошибках, можно увеличить цикл с помощью более специфического подстановочного знака. Например, чтобы пропустить server3, используйте следующее: server[1-24-9]

1
27.01.2020, 21:23

Теги

Похожие вопросы