在Linux中执行文件操作(如cp、mv、rm和chown等)时,如何排除文件夹

在Linux中执行文件操作(如cp、mv、rm和chown等)时,如何排除文件夹,linux,bash,command-line,filesystems,Linux,Bash,Command Line,Filesystems,在执行文件操作(如cp等)时,如何排除文件夹 我目前会使用通配符*将文件操作应用于所有文件夹,但我需要排除一个文件夹 我实际上想要使用的命令是chown来更改目录中所有文件的所有者,但我需要排除一个子目录。组合多个unix小型sharp工具: for file in *; do if [ $file != "file_I_dont_want_to_chown" ] then chown -R Camsoft $file fi done 要排除文件夹“foo” 如果

在执行文件操作(如cp等)时,如何排除文件夹

我目前会使用通配符*将文件操作应用于所有文件夹,但我需要排除一个文件夹


我实际上想要使用的命令是
chown
来更改目录中所有文件的所有者,但我需要排除一个子目录。

组合多个unix小型sharp工具:
for file in *; do
  if [ $file != "file_I_dont_want_to_chown" ]
    then
      chown -R Camsoft $file
  fi
done 
要排除文件夹“foo”


如果您正在使用bash并通过
shopt-s extglob
启用extglob,那么您可以使用
!()
以排除给定模式。

另一个选项可能是临时删除对该文件/文件夹的权限。
在Unix中,您需要对目录具有“x”权限才能进入该目录


编辑:显然,如果您正在备份实时制作数据库,这是行不通的,但是在将文档复制到USB密钥时,为了排除您的“有趣的图像”集合,这是可以实现的。

对于这种情况,我建议使用find。可以使用-not-iwhilename“PATH”指定要排除的路径。然后使用exec执行您想要执行的命令

find dir_to_start -name dir_to_exclude -prune -o -print0 | xargs -0 chown owner

find dir_to_start -not -name "file_to_exclude"  -print0 | xargs -0 chown owner
find . -not -iwholename './var/foo*' -exec chown www-data '{}' \;
虽然这可能对您的情况有所帮助,但我也看到脚本设置了不可变标志。确保在完成时删除该标志,您应该为此使用陷阱,以防脚本提前终止(注意:从脚本运行,陷阱代码在bash会话退出时运行)。我的选择有很多麻烦,但在某些情况下是好的

cd /var
trap 'chattr -R -i foo > /dev/null 2>&1' 0
chattr -R +i foo
chown -R www-data *

这会递归地工作,深入到子目录吗?这里的
-0
没有任何作用。在执行上述命令时,我遇到了一个“文件名太长”错误。错误中显示的文件名似乎是目录中以“\n”分隔的所有文件的串联,这是因为
ls
不打算以这种方式使用。“-d”\n”可能会有所帮助。我现在不在linux机器上,所以我不能确定。它与cygwin一起工作。您不需要
ls
。只要对*中的文件使用
,至少对于bash-an-sh,您需要
do
以逻辑方式开始循环。我已经执行了上面的命令。你能给我举一个例子,使用的!()语法与chown的结合?真有效!还有一个问题,排除的文件名是否会重复应用,这样,如果在目录树的更深处有一个名为foo的文件夹或文件,该文件夹或文件是否也会被跳过?我只想排除第一个foo,它是顶级文件夹的直接后代。仅当您使用诸如
**/foo
之类的模式时。例如:chown 0755-R!(**/foo)?在bash脚本中如何执行此操作?chown-R775!(foo)休息。我试过了!“(foo)”但它接着说
没有这样的文件或目录
不幸的是,我想排除的目录是一个certs文件夹,弄乱这个文件夹的权限会破坏我们的HTTPS请求。很公平-只是有时候解决方案比复杂的regex/xargs语句简单;-)交叉发布在这里:我最初在这里发布,但后来不确定我是否在正确的网站上发布,所以我重新发布只是为了确定。
cd /var
trap 'chattr -R -i foo > /dev/null 2>&1' 0
chattr -R +i foo
chown -R www-data *