这应该这样做:
#!/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)。
缺点:正如 ormaaj 在评论中指出的那样,如果目标路径的名称包含模式字符,这可能会失败*
。安全地考虑了这种情况,如果发生这种情况,脚本会优雅地退出。
解释。
- 给那个脚本一个参数。它可以是相对于当前目录的绝对值。
readlink
, 使用该-m
选项会注意将其转换为绝对路径:这就是变量destdir
.
- 如果适用,该目录
$destdir
与其父目录一起创建。
- 在主目录中,如果我们找到
$destdir
目录,我们会修剪这个分支,否则,我们会查找所有*.txt
文件并将它们复制到$destdir
.
再一次,这个脚本对于带有有趣符号的文件名是 100% 安全的:空格、换行符或连字符,除了*
目标目录名称中的模式字符,但这种情况可以通过优雅的退出安全地处理,而不是潜在地搞砸文件。