2015-10-08 8 views
-1

Я запускаю shellscripting, и у меня возникают проблемы со сценарием. Итак, у меня есть два файла (неважно, какие файлы у меня есть), и мне нужно проверить, существуют ли файлы в папке1 в папке 2. Если да, проверьте, является ли его измененная дата более поздней.Проверьте, существует ли конкретный файл в папке в другом - Shellscript

Это то, что я есть:

#!/bin/sh 

for i in `find $1 -type f` 
do 
    for j in `find $2 -type f` 
    do 
     if [ -e $2/$i ] 
     then 
      if [ $i -ot $j ] 
      then 
       echo File "`basename $i`" its newer and it will be copied 
      else 
       echo File is updated 
      fi 
     else 
      echo "`basename $i`" will be copied because it doesn't exist 
     fi 
    done 
done 

$ 1 и $ 2 аргументы папки

Заранее спасибо

EDIT: С 3 файлов в folder1 и один из них (file2) в папке 2 я получаю этот вывод.

я имел 3 файлов в folder1 и один из них был также в folder2 и я получил (file2 был в обеих папках):

file1 will be copied because it doesn't exist 
file2 will be copied because it doesn't exist 
file2 will be copied because it doesn't exist 
file1 will be copied because it doesn't exist 
file3 will be copied because it doesn't exist 
file3 will be copied because it doesn't exist 
+0

Почему это не работает? Какой результат? – grimsock

+0

У меня было 3 файла в папке1, и один из них также был в папке2, и я получил (файл2 был в обеих папках): 'file1 будет скопирован, потому что он не существует file2 будет скопирован, потому что его не существует file2 будет скопирован, потому что он не существует file1 будет скопирован, потому что он не существует file3 будет скопирован, потому что его не существует file3 будет скопирован, потому что его не существует' –

+0

Пожалуйста, обновите сообщение и вставить вывод скрипта. – grimsock

ответ

0

Две вещи неправильно в этом сценарии: A. Вы надеваете» t нужно вложенное для цикла, потому что вы делаете некоторую проверку против каждого файла в первом каталоге, а не для каждого файла в первом каталоге и, соответственно, каждого файла в каталоге scond (вот почему у вас так много файлов отображается). B. Когда вы используете find для получения файлов в каталоге, вам не нужен путь, просто имя файла, существование которого вы будете проверять во втором каталоге.

Вот исправленная версия. Дайте мне знать, решает ли ваша проблема.

#!/bin/bash 

for i in `find $1 -type f -printf "%f\n" | sort`; 
do 
    if [ -e "$2/$i" ] 
    then 
    if [ "$1/$i" -ot "$2/$i" ] 
    then 
     echo "File basename $i its newer and it will be copied" 
    else 
     echo "File is updated" 
    fi 
    else 
    echo "basename $i will be copied because it doesn't exist" 
    fi 
done