【问题标题】:Move all files in a folder to a new location if the same existing Folder name exists at remote location如果远程位置存在相同的现有文件夹名称,则将文件夹中的所有文件移动到新位置
【发布时间】:2020-05-29 10:53:26
【问题描述】:

寻找 bash 脚本: 情况如下: 我的备份目录驱动器上有 1000 个文件夹和子文件夹 让我们说......

  • /备份
  • /备份/文件夹A
  • /backup/folderA/FolderAA
  • /备份/文件夹B
  • /backup/folderB/FolderBB

我在辅助位置有数十个类似的文件夹(其中包含文件),文件夹名称将与主备份驱动器中的文件夹或子文件夹之一匹配。

我想将特定扩展类型的所有内容从我的辅助位置 $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 *以及删除的子文件夹和文件

【问题讨论】:

  • 添加所需的输入和输出。
  • 试试rsync 命令
  • alecxs - 因为在我的次要位置有一个名为 test 的文件夹,在我的备份位置也有一个名为 test 的文件夹,所以匹配!!
  • 您希望“仅在 $FolderName 匹配时移动匹配的文件夹”,但是您将hellotest 合并。当只有 parent 匹配时,您想从 all 子文件夹中移动文件吗?你想保留树还是只保留它的文件?并且在其他子文件夹中存在重复文件名时是否要覆盖文件?
  • alecxs - 如果文件夹匹配,那么我想将所有 .bak 和 .zip 文件从源位置(包括所有子文件夹)移动到我备份位置上的对应文件夹 - 我不想保留文件夹结构次要位置 - 只是文件的移动。迈克。

标签: bash file ubuntu


【解决方案1】:

使用引用的文件夹和文件类型运行此脚本:

./merge.sh "backup" "secondarylocation/mike" "*.zip" "*.bak"
  • 如果要搜索后缀区分大小写,请将-iname 替换为-name
  • 当您不想覆盖重复的文件名时,将 mv -fv 替换为 mv -nv
  • 如果要保留空文件夹test,请将-mindepth 1 添加到最后find

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(收获果实并砍树)

【讨论】:

  • 太棒了 - 我会在几个小时内尝试这个并报告回来。非常感谢!!!
  • 抱歉耽搁了 - 完美运行 - 我根据自己的需要做了一些调整 - 但工作很棒!
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
相关资源
最近更新 更多