1

Мой вопрос касается сохранения множества файлов из множества каталогов только в одной директории путем сохранения всех старых версий файлов. У меня около 10 каталогов с очень похожими файлами (10 каталогов резервных копий, созданных с использованием Linux, Windows и MacOS). Я хочу объединить эти 10 каталогов только в одном. Например, у меня есть 3 каталога a, b и c со следующим содержимым:

  • a

    • fileA.txt (дата 10/10/2012)
    • fileB.txt (дата 12.10.2012)
    • fileC.txt (дата 01/05/2013)
  • б

    • fileA.txt (дата 10/01/2013)
    • fileB.txt (дата 10.02.2013)
    • fileC.txt (дата 01/05/2013)
    • fileD.txt (дата 02/05/2013)
  • с

    • fileA.txt (дата 10/10/2012)
    • fileB.txt (дата 12/02/2013)

Результирующий каталог должен быть:

  • fileA.txt (дата 10/01/2013 от b)
  • fileA.txt_20121010hhmmss (из a и c (тот же файл))
  • fileB.txt (дата 12/02/2013 от c)
  • fileB.txt_20121210hhmmss (из)
  • fileB.txt_20130210hhmmss (из б)
  • fileC.txt (дата 01/05/2013 из a и b (тот же файл))
  • fileD.txt (дата 02/05/2013 из б)

чч = часы мм = минуты сс = секунды

В настоящее время я работаю над сценарием Perl, который может сравнивать файлы с помощью функции "сравнить" и контрольной суммы md5.

Я приказываю найти дату изменения (если файлы отличаются), я использую метаданные (когда могу), используя Exiftool (несколько совместимых файлов, таких как docx, ppt pdf jpg ...), в противном случае я использую метку времени с помощью команды stat ,

Файл без добавленного расширения должен быть самым последним из всех файлов с одинаковым именем.

Скрипт Perl очень медленный и сложный, поэтому я ищу более надежное решение.

Спасибо за помощь.

NB: - Я хочу использовать это решение на сервере Synology (DS212), на котором у меня действительно мало классических команд оболочки. При необходимости я могу скопировать эти файлы на машину с Linux (или OSX), чтобы сделать это.

1 ответ1

1

Решение:

cat backup.sh
#!/bin/sh
for i in `find ./{a,b,c} -type f`
do
  FILE=`basename $i`
  FTIME=`stat -c %x $i | awk -F"." '{print $1}' | sed 's/[-: ]//g'`
  NEWNAME=${FILE}_${FTIME}
  echo "cp $i result/${NEWNAME}"
  cp -p $i result/${NEWNAME}
done
cd result
for i in `ls -1 | awk -F"_" '{print $1}' | sort -u`
do
  TNAME=`ls -1t ${i}* | head -1`
  echo "mv ${TNAME} ${i}"
  mv ${TNAME} ${i}
done

Резервное копирование файлов в директорию "result".

Как это работает (пример):

$ ls -l {a,b,c,result}
a:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt

b:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt

c:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt

result:
total 0


~/tmp/backup $ ./backup.sh 
cp ./a/fileA.txt result/fileA.txt_20130606162832
cp ./a/fileB.txt result/fileB.txt_20130606162836
cp ./a/fileC.txt result/fileC.txt_20130606162846
cp ./b/fileA.txt result/fileA.txt_20130606162857
cp ./b/fileD.txt result/fileD.txt_20130606162910
cp ./b/fileB.txt result/fileB.txt_20130606162900
cp ./b/fileC.txt result/fileC.txt_20130606162906
cp ./c/fileA.txt result/fileA.txt_20130606162920
cp ./c/fileB.txt result/fileB.txt_20130606162923
mv fileA.txt_20130606162920 fileA.txt
mv fileB.txt_20130606162923 fileB.txt
mv fileC.txt_20130606162906 fileC.txt
mv fileD.txt_20130606162910 fileD.txt


~/tmp/backup $ ls -l {a,b,c,result}
a:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt

b:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt

c:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt

result:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt_20130606162832
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt_20130606162857
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt_20130606162836
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt_20130606162900
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt_20130606162846
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt


~/tmp/backup $

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .