将按年龄划分的文件夹结构文件移动到不同的驱动器

将按年龄划分的文件夹结构文件移动到不同的驱动器

我有一个名为Research(其中还包括子文件夹)的文件夹。

我希望定期将Research6 个月以上的文件移动到另一个Research_Archive驱动器上名为 的文件夹。超过 6 个月的文件将从 中删除Research
该文件夹Research_Archive将重现 的子文件夹结构Research

该脚本将定期运行,因此 Research_Archive 将会更新。

我看到了这样的脚本:

find . -type f -mtime +5 -print0 | while IFS= read -r -d '' file; do
    dir="${file%/*}"
    mkdir -p ../rootarchive/"$dir"
    mv "$file" ../rootarchive/"$file"
done

但作为脚本新手,我对它的相对路径完全感到困惑。例如,我的源路径是:/home/me/Documents/Research/而目标路径是:/media/me/drive21/Documents/Research_Archive/

而且我不确定如果多次运行上述脚本,是否会Research_Archive再次创建该文件夹。以及如何设置文件Research_Archive夹的权限(当我尝试测试时,我被锁定,无法查看创建的文件夹的视图文件管理器)。

任何帮助/具体例子都将不胜感激。

答案1

该脚本应该在这方面有所帮助:

#!/bin/bash

from=$1
destination=$2
if [[ -d "$from" && -s "$from" ]]; then

        # extract the name of the sub directory
        # to be create
        src=$(sed -r 's/.*\/(Research).*/\1/' <<< "$from")

        if [[ -d /media/me/drive21/Documents/Research_Archive/ ]]; then

                destination=/media/me/drive21/Documents/Research_Archive/

                if [[ ! -d "$destination/$src" ]]; then                       

                        mkdir "$destination/$src"
                        newdes="$destination/$src"
                        find "$from" -type f -mtime +5 -print0 -exec mv {} "$newdes" \;
                else
                        cd "$destination"
                        find "$from" -type f -mtime +5 -print0 -exec mv {} "$newdes" \;

                fi

         else
                exit 1
         fi
else
        exit 1
fi

用法:

chmod +x mv.sh
./mv.sh /home/me/Documents/Research/  /media/me/drive21/Documents/Research_Archive

使用udev规则自动将文件移动到外部存储:

  1. 修改代码以适应此设置:
    #!/bin/bash

    from=$1
    destination=$2
    if [[ -d "$from" && -s "$from" ]]; then

            # extract the name of the sub directory
            # to be create
            src=$(sed -r 's/.*\/(arch).*/\1/' <<< "$from")

            if [[ -d "/media/me/drive21/Documents/Research_Archive/" ]];then


                 destination="/media/me/drive21/Documents/Research_Archive/"

                    if [[ ! -d "$destination/$src" ]]; then

                            cd "$destination"
                            mkdir "$src"

                            find "$from" -type f -mtime -5 -exec mv {} "$src" \;
                    else
                            cd "$destination"
                            find "$from" -type f -mtime -5 -exec mv {} "$src" \;

                    fi

            else
                    exit 1
            fi
    else
            exit 1
    fi
  1. 设置挂载设备事件:

    • 创建.rule文件:

      KERNEL=="sd*", SUBSYSTEM=="block", ATTR{removable}=="1", ATTRS{serial}=="07083395757D2761", MODE="0777", RUN+="/home/me/mv.sh /home/me/Documents/Research/ /media/me/drive21/Documents/Research_Archive"
      
    • 调用此函数90-move.rules并放置在/etc/udev/rules.d目录中

    • 用于udevadm info -a -n /dev/sd*获取有关外部存储设备所需的信息。

      在此处输入图片描述

  2. 现在只需插入您的设备,一旦设备被识别rule,文件就会被移动。请调整代码,使其最适合您。

来源:

http://www.reactivated.net/writing_udev_rules.html

https://docs.oracle.com/cd/E37670_01/E41138/html/ch07s03.html

https://wiki.debian.org/udev

https://www.linux.com/news/udev-introduction-device-management-modern-linux-system

相关内容