2016-09-25 2 views
0

Я искал по всему Интернету сценарий .sh, чтобы этого сделать, но я не нашел его.Создать .новый файл из списка файлов

В этот момент у меня есть сценарий, который создаст список файлов с помощью команды find. Этот список файлов используется с копией для тиражирования их в другой папке, и все работает хорошо.

Теперь я хочу создать файл сценария, который возьмет список файлов и выполнить следующий тест: - Если файл не существует по назначению, скопируйте его. - Если файл существует в пункте назначения и он совпадает с источником, не делайте никаких действий. - Если файл существует в месте назначения и он отличается от источника, скопировать его и изменить его расширение .new

Это скрипт, который будет создавать список файлов:

# File source to copy text files 
find /home/repo/source -type f -name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' > ../copy-from.txt 
sed -i 's/ /\\ /g' ../copy-from.txt 

# File destination to copy text files 
find . -type f -name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' > ../copy-to.txt 
sed -i 's/ /\\ /g' ../copy-to.txt 
sed -i 's/\(.\{2\}\)//' ../copy-to.txt 

# Merge source and destination files and add cp command 
paste ../copy-from.txt ../copy-to.txt > ../copy.sh 
rm ../copy-from.txt ../copy-to.txt 
sed -i 's/^/cp /' ../copy.sh 

Надежда кто-то может укажите мне правильный путь или предоставите сценарий, который будет делать то, что я ищу.

С уважением

+0

Это называется 'rsync' уверенно? –

+0

Я посмотрел на rsync, и я не вижу, как rsync может создавать .new файлы, если они новее. – Webix

+0

Важное примечание. Я хочу, чтобы сценарий создавал .new файлы, а не перезаписывал существующие. – Webix

ответ

0

Мне кажется, что вы, возможно, придется использовать такой инструмент, как git. Затем вы можете использовать два репозитория и проверить коммиты, прежде чем вы вытащите/слейте из другого репозитория.

Если вы настаиваете на том, чтобы делать это так, как описано выше, вот небольшой скрипт bash, который делает это. Он делает все за один шаг, т. Е. Не генерируются временные файлы со списком файлов, которые нужно скопировать, он просто находит все новые/измененные файлы в исходном каталоге и копирует их в целевой каталог, добавляя при необходимости суффикс .new ,

src='/path/to/source/dir' 
dst='/path/to/destination/dir' 
find "$src" -type f \(-name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' \) -printf '%P\0' | 
    while IFS= read -r -d '' file; do 
     if [[ ! -e "$dst/$file" ]]; then 
      cp -a -- "$src/$file" "$dst/$file" 
     elif ! cmp --silent "$src/$file" "$dst/$file"; then 
      cp -a -- "$src/$file" "$dst/$file.new" 
     fi 
    done 

Он использует cmp, чтобы выяснить, если два файла идентичны. Это означает, что это может быть медленным, если задействованные файлы являются большими, поскольку, возможно, он должен прочитать весь файл. Однако это должно быть хорошо для небольших файлов конфигурации. Конечно, это сценарий оболочки, он может быть медленным, если у вас много файлов, так как он вызывает внешние программы.

+0

Спасибо за скрипт. Фактически, я не хочу создавать репозиторий git для синхронизации. И когда я запустить этот сценарий, я получаю это: '# /home/repo/update.sh /home/repo/update.sh: строка 3: $ '\ г': команда не найдена находки: '/ home/repo/sources \ r ': Нет такого файла или каталога /home/repo/update.sh: строка 7: синтаксическая ошибка около неожиданного токена 'elif ' /home/repo/update.sh: строка 7:' elif! cmp --silent "$ src/$ file" "$ dt/$ file"; then # ' – Webix

+0

Вы уверены, что вы вставили файл правильно? Похоже, что была задействована машина Windows и перепутала разрывы строк. Преобразуйте их в разрывы строк unix (LF, а не CRLF), прежде чем запускать их. Есть удобная программа командной строки, которая может сделать это с именем 'dos2unix'. – redneb

Смежные вопросы