我试图写一个简单的bash脚本,将复制一个文件夹的全部内容,包括隐藏的文件和文件夹到另一个文件夹,但我想排除某些特定的文件夹。我怎么才能做到呢?
当前回答
简单的解决方案(但我仍然更喜欢从顶部注释匹配bash模式):
touch /path/to/target/.git
cp -n -ax * /path/to/target/
rm /path/to/target/.git
这将利用cp的-n选项,强制cp不覆盖现有目标。
缺点:适用于GNU cp。如果您没有GNU cp,那么cp操作可能会返回一个错误代码(1),这很烦人,因为这样您就无法判断它是否是一个真正的失败。
其他回答
使用焦油和管道。
cd /source_directory
tar cf - --exclude=dir_to_exclude . | (cd /destination && tar xvf - )
您甚至可以跨ssh使用此技术。
简单的解决方案(但我仍然更喜欢从顶部注释匹配bash模式):
touch /path/to/target/.git
cp -n -ax * /path/to/target/
rm /path/to/target/.git
这将利用cp的-n选项,强制cp不覆盖现有目标。
缺点:适用于GNU cp。如果您没有GNU cp,那么cp操作可能会返回一个错误代码(1),这很烦人,因为这样您就无法判断它是否是一个真正的失败。
类似于Jeff的想法(未经测试):
find . -name * -print0 | grep -v "exclude" | xargs -0 -I {} cp -a {} destination/
EXCLUDE="foo bar blah jah"
DEST=$1
for i in *
do
for x in $EXCLUDE
do
if [ $x != $i ]; then
cp -a $i $DEST
fi
done
done
未经考验的……
使用 rsync:
rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
注意,使用source和source/是不同的。后面的斜杠表示将文件夹源的内容复制到目标。如果没有后面的斜杠,它意味着将文件夹源复制到目标。
或者,如果要排除很多目录(或文件),可以使用——exclude-from=FILE,其中FILE是包含要排除的文件或目录的文件名。
——exclude也可以包含通配符,例如——exclude=*/.svn*
推荐文章
- 对以制表符分隔的文件进行排序
- Shell脚本删除超过n天的目录
- 使用sudo时未找到命令
- 如何防止rm报告文件未找到?
- 如何检查shell脚本中是否存在命令?
- Bash:获取输出的第n列的最短方法
- 如何使用查找命令从列表中查找所有具有扩展名的文件?
- 如何获得一个变量值,如果变量名存储为字符串?
- RVM不是一个函数,用' RVM use…’不会起作用
- 如何打破一个循环在Bash?
- 如何从终端机发送电子邮件?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- Linux Bash中双&和分号有什么区别?
- 如何合并2 JSON对象从2个文件使用jq?
- 在Bash中模拟do-while循环