Linux скрипт для копирования файлов с нескольких компьютеров Windows

#linux #bash #rsync #smb

#linux #bash #rsync #smb

Вопрос:

Возникла проблема при попытке создать скрипт bash, который будет считывать ip-адрес и имена пользователей из файла, который подключает соединение к этому общему ресурсу в Windows, а затем копирует типы файлов ano в новую папку с именем пользователя. На данный момент это не совсем работает, это создает сотни папок с именем *.ano, если не удается найти общий ресурс Windows.

Помогите, пожалуйста

Текстовый файл:

 192.168.0.2 user1
192.168.0.3 user2
  

bash скрипт:

 USER='/home/user/user.ip'
IPADDY=$(grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' $USER)
USERNAME=$(awk '{ print $NF }' $USER)
for i in $IPADDY $USERNAME
do
    mkdir /home/user/Documents/$USERNAME
    mount -t smbfs //$IPADDY/$USERNAME /home/user/$USERNAME
    rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/*.ano
done
  

Всем привет, спасибо за такой быстрый ответ, я изменил код следующим образом, но все равно получаю несколько файлов, я сделал что-то не так здесь

     USER='/home/user/user.ip'
IPADDY=$(grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' $USER)
USERNAME=$(awk '{ print $NF }' $USER)
while read IPADDY USERNAME; do
mkdir /home/user/Documents/$USERNAME
mount -t smbfs //$IPADDY/$USERNAME /home/user/$USERNAME
rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/
done < $USER
  

Ответ №1:

Проблема в for команде. В вашем скрипте i выполняется итерация по содержимому $IPADDY, затем он выполняет итерацию по содержимому $USERNAME. Между тем, $USERNAME внутри цикла расширяется до user1 user2 , в результате чего:

 mkdir /home/user/Documents/user1 user2
  

Строка монтирования становится:

 mount -t smbfs //192.168.0.2 192.168.0.3/user1 user2 /home/user/user1 user2
  

И так далее.

Скорее, выполните цикл над самим файлом:

 while read IPADDY USERNAME; do
  #awesome things here based on $IPADDY and $USERNAME
done < $USER
  

Возможно, вы захотите добавить [[ -z $IPADDY ]] amp;amp; continue , чтобы пропускать любые возможные пустые строки в файле.

Комментарии:

1. Всем привет, спасибо за такой быстрый ответ Всем привет, спасибо за такой быстрый ответ, я изменил код следующим образом, но все равно получаю несколько файлов, я что-то сделал не так здесь USER =’/home/user /user.ip’ IPADDY = $ (grep -o ‘[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}’ $ ПОЛЬЗОВАТЕЛЬ) USERNAME=$(awk ‘{ print $ NF }’ $USER) при чтении ИМЕНИ ПОЛЬЗОВАТЕЛЯ IPADDY; монтируем mkdir /home/user/Documents/$USERNAME в smbfs //$IPADDY/$USERNAME /home/user/$USERNAME rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/ выполнено < $USER

2. @pepoluan спасибо за вашу помощь, я изменил код, но все еще получаю несколько файлов, я сделал что-то не так здесь USER='/home/user/user.ip' IPADDY=$(grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' $USER) USERNAME=$(awk '{ print $NF }' $USER) while read IPADDY USERNAME; do mkdir /home/user/Documents/$USERNAME mount -t smbfs //$IPADDY/$USERNAME /home/user/$USERNAME rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/ done < $USER

3. @Grimlockz вы не должны повторно синхронизировать, если не удалось смонтировать; добавьте ` amp;amp;` (пробел и и) за mount строкой. amp;amp; Означает выполнение следующей команды, только если возвращается последняя команда 0 (что в мире * nix означает успех). Кроме того, вы можете удалить строки 2 и 3 (те, что с grep и awk ); они больше не нужны.

4. USER='/home/billy/user.ip' #IPADDY=$(grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' $USER) #USERNAME=$(awk '{ print $NF }' $USER) while read IPADDY USERNAME; do mkdir /home/billy/Documents/$USERNAME mount amp;amp;` -t smbfs //$IPADDY/$USERNAME /home/billy/$USERNAME cp /home/billy/$USERNAME/*.ano /home/billy/Documents/$USERNAME/ готово < $USER` Вы имеете в виду вот это?

5. @pepoluan USER='/home/billy/user.ip' #IPADDY=$(grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' $USER) #USERNAME=$(awk '{ print $NF }' $USER) IPADDY=$USER USERNAME=$USER while read IPADDY USERNAME; do ' amp;amp;' mkdir /home/billy/Documents/$USERNAME mount -t smbfs //$IPADDY/$USERNAME /home/billy/$USERNAME ' amp;amp;' rsync -va /home/billy/$USERNAME/ /home/billy/Documents/$USERNAME/ done < $USER Я приближаюсь, я думаю, файлы копируются сейчас, единственная проблема сейчас в том, что я должен ввести пароль, если монтирование существует

Ответ №2:

Одна из проблем заключается в том, что вы используете подстановочный знак ( * ) для файлов назначения. Но эти файлы не существуют — следовательно, /home/user/Documents/$USERNAME/*.ano не могут совпадать, и rsync создаст файл *.log .

Лучше сделать:

 rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/