从一个文件夹复制文件并将其粘贴到同一文件夹名下的另一个位置

从一个文件夹复制文件并将其粘贴到同一文件夹名下的另一个位置

请帮忙备份一下……我正在尝试做点什么,但我不知道该如何开始。我想在 Ubuntu 中编写一个脚本,搜索我的 W7 分区的所有文件夹,只要有 .cdr 文件,它就会(选择并)复制该文件夹中的所有文件(.jpg、.png、.pdf 等),但不会复制该文件夹中的其他文件夹。然后,它会将这些文件粘贴到我的外部驱动器上,文件夹名称与复制这些文件的文件夹名称完全相同。

我知道这很复杂,而且我的英语也不太好。

我希望你能理解我的挣扎并帮助我。

非常感谢任何帮助甚至建议。谢谢!

答案1

脚本

find使用一些和bash 脚本魔法不会太糟糕rsync。将其放入文件 ( backup.sh) 中:

#!/bin/bash

source_dir=${1:-<source directory>}
dest_dir=${2:-<destination directory>}
tmp_file=/tmp/$USER/bkp_files

find "$source_dir" -name '*.cdr' -print | while read file; do
    find "$(dirname $file)" -maxdepth 1 -xtype f -print
    done > "$tmp_file"

rsync --files-from "$tmp_file" / "$dest_dir"

然后你必须让它可执行

$ chmod +x backup.sh

你可以使用以下命令运行脚本

$ ./backup.sh

一步步

让我解释

find "$source_dir" -name '*.cdr' -print

查找所有 .cdr 文件,$source_dir 然后将其输入到 while 循环中:

| while read file; do ...  done > "$tmp_file"

这将获取上一个find命令中的每个文件,执行一些命令并将结果写入$tmp_file。注意:这仅在文件名不包含换行符时才有效,这应在 windows 分区中提供。第二个 find 是

find "$(dirname $file)" -maxdepth 1 -xtype f -print

这里$(dirname $file)给出了 .cdr 文件的目录名称。这是我们下一个 find 命令的起点。在这里,我们不会深入到子目录中,-maxdepth 1而只对文件感兴趣-xtype f

最后我们使用 rsync 复制我们保存的文件$tmp_file

rsync --files-from "$tmp_file" / "$dest_dir"

rsync将保持目录树结构原样,这正是您想要的,对吗?

有关详细信息,请参阅手册页:

$ man find
$ man rsync

相关内容