Синхронизация двух папок и при успешном копировании одного файла из одного места в другое

Я использую команду rsync для синхронизации двух папок и успеха rysnc. Я хочу скопировать успех файла и при копировании добавить параметр имени исходной папки, такой как Success_FolderName.Я использую $ (basename!: 3), чтобы получить третий параметр, то есть имя папки ,

bash /Sync.sh 10_03_2016

 #! /bin/bash set -o history set -o histexpand /usr/bin/rsync -avh -r /Source/$1 /Destination/ rsyncStatus=$? folderParam=$(basename !:3) if($rsyncStatus==0) then cp /Status/Sucesss /Result/Success_$folderParam else cp /Status/Failure /Result/Failure_$folderParam if 

Вывод

ошибка

 /Sync.sh: line 7: :3: bad word specifier 

И файл копируется с 'Success_'

  • Как извлечь дату и рассчитать, находится ли она в течение «х» дней с сегодняшнего дня?
  • bash - Изменение по строкам Interactively
  • Как кот командный файл?
  • Как удалить слова, заканчивающиеся буквой S, если дубликаты без S на конце находятся в одном списке?
  • Как заставить excel интерпретировать китайские символы в CSV-файле
  • Преобразование числа месяцев в месяц
  • Изменение шаблонов гвоздики zsh для использования с cp
  • Escape shell arg из одного сценария в другой
  • 2 Solutions collect form web for “Синхронизация двух папок и при успешном копировании одного файла из одного места в другое”

    Я не понимаю, почему вы делаете это настолько сложным. Зачем использовать (довольно сложную) !:N расширения истории !:N когда у вас уже есть все, что вам нужно передать в качестве аргумента? Например:

     #! /bin/bash source="/Source/$1" destination="Destination/" folderParam="$(basename "$source")" /usr/bin/rsync -avh -r "$source" "$destination" rsyncStatus=$? if($rsyncStatus==0) then cp /Status/Sucesss /Result/Success_"$folderParam" else cp /Status/Failure /Result/Failure_"$folderParam" if 

    Или, еще проще:

     #! /bin/bash source="/Source/$1" destination="Destination/" folderParam="$(basename "$source")" if /usr/bin/rsync -avh -r "$source" "$destination"; then cp /Status/Sucesss /Result/Success_"$folderParam" else cp /Status/Failure /Result/Failure_"$folderParam" if 

    Или даже:

     #! /bin/bash source="/Source/$1" destination="Destination/" folderParam="$(basename "$source")" touch "/Result/Failure_$folderParam" /usr/bin/rsync -avh -r "$source" "$destination" && mv /Result/Failure_"$folderParam" /Result/Success_"$folderParam" 

    Ответ Тердона лучше, но если вы действительно хотите использовать операторы истории, вы можете указать, к какой команде вы хотите обратиться:

     !rsync:3 

    будет заменен третьим параметром на последний вызов rsync . Так что в вашем случае,

     folderParam=$(basename !rsync:3) 
    Linux и Unix - лучшая ОС в мире.