Переместите все файлы в папке в новое место, если такое же имя существующей папки существует в удаленном месте - PullRequest
1 голос
/ 28 мая 2020

Ищу сценарий bash: Вот ситуация: у меня есть 1000 папок и подпапок на моем Backup Directory Drive, скажем ...

  • / backup
  • / backup / folderA
  • / backup / folderA / FolderAA
  • / backup / folderB
  • / backup / folderB / FolderBB

У меня десятки похожих папок во вторичном расположении (с файлами в них), и имена папок будут соответствовать одной из папок или подпапок на основном резервном диске.

Я хотел бы переместить все содержимое указанного c расширения типы из моего вторичного местоположения $ FolderName в хранилище резервной копии + соответствующая подпапка ТОЛЬКО, если $ FolderName точно совпадает, и удалите папки из моего дополнительного местоположения!

Если в хранилище резервной копии нет соответствующей папки или подпапки, оставьте только исходные папки и файлы.

с нетерпением жду помощи / руководства.

Майк

Требуется дополнительная информация. Ожидаемый ввод и вы поместите

Допустим, у меня есть следующее: Папка резервного копирования

/backup/test/file.bak

И для моего вторичного местоположения папки:

/secondarylocation/mike/test/hello/john.bak
/secondarylocation/mike/test/hello/backup.zip

я бы хотел, чтобы это был конечный результат

/backup/test/file.bak
/backup/test/john.bak
/backup/test/backup.zip

и / secondarylocation / mike / test *, а вложенные папки и файлы удалены

1 Ответ

0 голосов
/ 28 мая 2020

запустите этот сценарий с указанными папками и типами файлов:

./merge.sh "backup" "secondarylocation/mike" "*.zip" "*.bak"
  • замените -iname на -name, если вы хотите искать суффикс, чувствительный к регистру
  • replace mv -fv с mv -nv, если вы не хотите перезаписывать повторяющиеся имена файлов
  • добавить -mindepth 1 к последнему find, если вы хотите сохранить пустую папку test

merge.sh

#!/bin/bash

# read folders from positional parameters
[ -d "$1" ] && targetf="$1" && shift
[ -d "$1" ] && sourcef="$1" && shift

if [ -z "$targetf" ] || [ -z "$sourcef" ]
  then
    echo -e "usage: ./merge.sh <targetfolder> <sourcefolder> [PATTERN]..."
    exit 1
fi

# add prefix -iname for each pattern
while [ ${pattern:-1} -le $# ]
  do
    set -- "$@" "-iname \"$1\""
    shift
    pattern=$((${pattern:-1}+1))
done

# concatenate all prefix+patterns with -o and wrap in parentheses ()
if (( $# > 1 ))
  then
    pattern="\( $1"
    while (( $# > 1 ))
      do
        pattern="$pattern -o $2"
        shift
    done
    pattern="$pattern \)"
  else
    pattern="$1"
fi

# move files from searchf to destf
find "$targetf" -mindepth 1 -type d -print0 | sort -z | while IFS=$'\0' read -r -d $'\0' destf
  do
    find "$sourcef" -mindepth 1 -type d -name "${destf##*/}" -print0 | sort -z | while IFS=$'\0' read -r -d $'\0' searchf
      do
        if (( $# ))
          then
            # search with pattern
            eval find "\"$searchf\"" -depth -type f "$pattern" -exec mv -fv {} "\"$destf\"" \\\;
          else
            # all files
            find "$searchf" -depth -type f -exec mv -fv {} "$destf" \;
        fi
        # delete empty folders
        find "$searchf" -depth -type d -exec rmdir --ignore-fail-on-non-empty {} +
    done
done

exit 0

это объединит hello в test (заработайте плоды и срежьте дерево)

...