请帮忙备份一下……我正在尝试做点什么,但我不知道该如何开始。我想在 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