我必须做一个脚本,它将所有* .txt文件从主目录复制到在此脚本的第一个参数($ {1})中指定的新创build的目录中。
如果备份目录已经存在,我想跳过它。 我正在尝试-prune排除查找,但它不适用于我。 最后,我已经在循环中,如果声明,这也是行不通的,我不知道为什么…谢谢你的帮助!
这是我的代码:
#!/bin/bash mkdir ${1} for file in $(find ~/ -name *.txt) do if [ ! -f ~/${1}/$file ] then cp -i -v $file -t ~/${1} fi done
Linux备份服务与冰川支持
Windows 7操作中心
使用Git在闪存驱动器上进行站点备份
任何人都可以在Vista上运行.Net应用程序的影子副本。
在中断的传输上恢复rsync部分(-P / – 部分)
在日志文件中保留60行
如何备份/移动LXC容器?
Windows卷影复制错误:2155348129
mkdir ${1}
但是复制和测试不同的路径( -f ~/${1}/$file , -t ~/${1} )。 创建一个变量来防止这样的错误:
#!/bin/bash dest=~/${1} [ -d "$dest" ] || mkdir "$dest" SAVEIFS=$IFS IFS=$(echo -en "nb") for file in $(find ~/ -name '*.txt' -print) do dfile="$dest/"$(basename "$file") if [ "$file" -ef "$dfile" ]; then echo same else cp -i -v "$file" -t "$dfile" fi done IFS=$SAVEIFS
这应该做的:
#!/bin/bash [[ -n "$1" ]] || { echo >&2 'Give me an argument!'; exit 1; } destdir=$(readlink -m -- "$1") [[ "$destdir" == *** ]] && { echo >&2 "Sorry,I'm in the stupid situation where the destination dir contains the `*' character. I can't handle this."; exit 1; } mkdir -pv -- "$destdir" || { echo >&2 "Couldn't create directory `$destdir'. Sorry."; exit 1; } find "$HOME" -path "$destdir" -prune -o ( -name '*.txt' -exec cp -iv -t "$destdir" -- {} ; )
Pro:适用于名称中有空格或有趣符号的文件(与您的不同)(除了一个愚蠢的情况,请参阅下面的Con )。
Con:正如ormaaj在评论中指出的那样,如果目标路径的名称包含模式字符* ,这可能会失败。 这种情况是安全的考虑到的,如果脚本发生的话,脚本会优雅地退出。
说明。
给那个脚本一个参数。 它可以是相对于当前目录的绝对值。 readlink ,使用-m选项会小心将其转换为绝对路径:这是变量destdir 。
如果适用的话,目录$destdir是由其父母创建的。
在home目录中,如果我们找到$destdir目录,我们修剪这个分支,否则,我们查找所有的*.txt文件并将它们复制到$destdir 。
再次,这个脚本是100%安全的文件名有趣的符号:空格,换行符或连字符,除了在目的地目录名称模式字符* ,但这种情况下安全处理的一个优雅退出,而不是潜在的拧档案。
你可以简化这个
mkdir -p "$1" find ~/ -name "$1" -prune,-name '*.txt' -print0 | xargs -0 cp -n -v -t "$1"
您必须引用*.txt ,否则shell会将其展开到当前目录中的所有.txt文件,而不是搜索主目录下的所有.txt文件。 -name "$1" -prune不包括备份目录。
xargs使用尽可能多的文件名来调用cp ,这样可以节省很多时间。
cp -n而不是cp -i防止覆盖已经存在的文件。 如果你想保留它,当然可以用-i替换-n 。
如果你想保留目录层次结构, rsync可能更适合这个备份任务。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。