我必须做一个脚本,它将主目录中的所有* .txt文件复制到此脚本的第一个参数($ {1})中指定的新创建的目录。
如果备份目录已存在,我想跳过它。我正在尝试排除查找中的-prune,但它对我不起作用。最后我在循环中做了if语句,这也行不通,我不知道为什么......谢谢你的帮助!!
这是我的代码:
#!/bin/bash
mkdir ${1}
for file in $(find ~/ -name *.txt)
do
if [ ! -f ~/${1}/$file ]
then
cp -i -v $file -t ~/${1}
fi
done
答案 0 :(得分:1)
这应该做:
#!/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
是使用其父目录创建的。$destdir
目录,我们会修剪此分支,否则,我们会查找所有*.txt
个文件并将其复制到$destdir
。对于带有滑稽符号的文件名,此脚本再次100%安全:空格,换行符或连字符,目标目录名中的模式字符*
除外,但该情况由a安全处理优雅的退出,而不是可能搞砸文件。
答案 1 :(得分:0)
您的代码中有错误,您正在创建目录:
mkdir ${1}
但是复制并测试不同的路径(-f ~/${1}/$file
,-t ~/${1}
)。创建一个变量以防止出现此类错误:
#!/bin/bash
dest=~/${1}
[ -d "$dest" ] || mkdir "$dest"
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
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
答案 2 :(得分:0)