#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/