From unknown Fri Sep 12 09:56:12 2025 X-Loop: help-debbugs@gnu.org Subject: bug#30477: [PATCH] chmod chown chgrp: added --exclude-files and --exclude-directories Resent-From: Ian Morris Nieves Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Fri, 16 Feb 2018 00:52:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 30477 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: 30477@debbugs.gnu.org X-Debbugs-Original-To: bug-coreutils@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.151874231323821 (code B ref -1); Fri, 16 Feb 2018 00:52:01 +0000 Received: (at submit) by debbugs.gnu.org; 16 Feb 2018 00:51:53 +0000 Received: from localhost ([127.0.0.1]:45357 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1emUFl-0006C9-C4 for submit@debbugs.gnu.org; Thu, 15 Feb 2018 19:51:53 -0500 Received: from eggs.gnu.org ([208.118.235.92]:43995) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1emU8y-00062D-GX for submit@debbugs.gnu.org; Thu, 15 Feb 2018 19:44:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1emU8s-0002eZ-5Q for submit@debbugs.gnu.org; Thu, 15 Feb 2018 19:44:47 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:58543) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1emU8r-0002eM-Pb for submit@debbugs.gnu.org; Thu, 15 Feb 2018 19:44:46 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34966) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1emU8q-0005gd-HW for bug-coreutils@gnu.org; Thu, 15 Feb 2018 19:44:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1emU8p-0002d8-JX for bug-coreutils@gnu.org; Thu, 15 Feb 2018 19:44:44 -0500 Received: from mail-qk0-x235.google.com ([2607:f8b0:400d:c09::235]:44823) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1emU8p-0002c8-2k for bug-coreutils@gnu.org; Thu, 15 Feb 2018 19:44:43 -0500 Received: by mail-qk0-x235.google.com with SMTP id l23so1939622qkk.11 for ; Thu, 15 Feb 2018 16:44:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alumni-cmu-edu.20150623.gappssmtp.com; s=20150623; h=from:mime-version:subject:message-id:date:to; bh=5pFGt1P9W33iTsqg5nFWpmZOVj7EyJwokL9U3qJYIbY=; b=gmUvoBn9xDa+xBe7dS4bbI3tSHjA27QwCJNdgx3R7svEahOhETst4cRc4b+fcQlJJC 4PWaxt4nrDyu+Z+Xfa2+4f9/PLfg0tg7kQwfzgkJ43zoBdnNLXejwJbaXkprcw/lkVol eGJKcTDhAjodEk7rfXyzwA9lpOoux5FQIw+EYawaFPrCIhgrAX2sSE/5RaJRSfQnnre5 YpOuNkQtysgxw5QCZX3ZYE7cgyC4pPZ/qfeER02oTe7Zm8CvSfdA0G58wW4k73PRKJgo n1zGuNXMxeJPSgpde2RGTyCKuFCax6zSfenHEQXWpZbiLGA14yNy+hJ8Gt+Rvd4F3Mcm PsGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:mime-version:subject:message-id:date:to; bh=5pFGt1P9W33iTsqg5nFWpmZOVj7EyJwokL9U3qJYIbY=; b=gzTYUGdj8eDseqs7rP2qxHlH1VrEi+aTMyhHX/e4qv6mI9GR0NGD05BWJWakMSjvef EUCmALMrOAUD7lTAsYQ6aaCI8mQnqwe3vPcMGLSCBNxQjds4lNNSOEs9Py4o0oLSONHA MEFDqJ5XiDEBmqiXpwiqjk9XHWA7li8lFpKf8zw9wuIdNopvlsRA1LMpR1VbRbbef7cS XpmzL0bpToMi9oggcurscqkzpyPEWOMlNEXqdpz4J69YOIj2ZlwleKk/ccaGxoI9eO00 cZaqOMTPnOmCICj2AZnRWtPaegKl4+knJP+kiG9AUW6jcyiHZclMry3WyWC1xVH+KKza lO2w== X-Gm-Message-State: APf1xPAjApdpnx3Zka7eVKfMLN7ElsjtPPtujBU4DY/r5UOLqyYBEPbA 1MT6jnD5OmwZN57O0d1Sikz6Htj0gyc= X-Google-Smtp-Source: AH8x226jXR/T9+zD9pIX6h3kMY3tXe74t5TH3FeHCi8CD1GJ4qeD8N+1zhy6xkpYNoIUbFo470lYhQ== X-Received: by 10.55.160.2 with SMTP id j2mr7261388qke.200.1518741881080; Thu, 15 Feb 2018 16:44:41 -0800 (PST) Received: from ?IPv6:2601:540::90c8:e931:3440:3b31:f0b1? ([2601:540:0:90c8:e931:3440:3b31:f0b1]) by smtp.gmail.com with ESMTPSA id s81sm11957610qkl.63.2018.02.15.16.44.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 15 Feb 2018 16:44:40 -0800 (PST) From: Ian Morris Nieves Content-Type: multipart/mixed; boundary="Apple-Mail=_B18FB8BC-1BE8-4D0C-B6D3-6031742A242E" Mime-Version: 1.0 (Mac OS X Mail 11.2 \(3445.5.20\)) Message-Id: <64599A13-382F-49DF-BA99-55D61BA33EA1@alumni.cmu.edu> Date: Thu, 15 Feb 2018 19:44:39 -0500 X-Mailer: Apple Mail (2.3445.5.20) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-Mailman-Approved-At: Thu, 15 Feb 2018 19:51:52 -0500 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) --Apple-Mail=_B18FB8BC-1BE8-4D0C-B6D3-6031742A242E Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hello all, Apologies if I have incorrectly followed any conventions. I=E2=80=99ve = tried. Attached please find a new feature I created to simplify setting = permissions (especially recursively), which enables the user to = separately target files or directories. Tests of correctness also included. Any input or feedback greatly appreciated. -ian --Apple-Mail=_B18FB8BC-1BE8-4D0C-B6D3-6031742A242E Content-Disposition: attachment; filename=patch Content-Type: application/octet-stream; x-unix-mode=0644; name="patch" Content-Transfer-Encoding: quoted-printable =46rom=20c14a291902346c8555ed2ecec5a45275a9019737=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Ian=20Morris=20Nieves=20= =0ADate:=20Thu,=2015=20Feb=202018=2016:32:21=20= -0800=0ASubject:=20[PATCH]=20chmod=20chown=20chgrp:=20added=20= --exclude-files=20and=20--exclude-directories=0A=0Achmod:=20added=20= --exclude-files=20and=20--exclude-directories=0Achown:=20added=20= --exclude-files=20and=20--exclude-directories=0Achgrp:=20added=20= --exclude-files=20and=20--exclude-directories=0A=0AIt=20is=20frequently=20= necessary=20to=20distinguish=20between=20files=0Aand=20directories=20= when=20setting=20permissions,=20especially=20when=0Asetting=20= permissions=20recursively.=20=20Current=20solutions=20like=0A+X=20and=20= find=20are=20unnecessarily=20complex.=20=20The=20flags=0A--exclude-files=20= and=20--exclude-directories=20are=20intended=0Ato=20greatly=20simpify=20= this=20common=20use=20case,=20with=20only=0Aminimal=20additional=20code=20= and=20documentation=20complexity/=0A=0A*=20src/chmod.c=20(enum,=20= long_options,=20process_file)=0A(usage,=20main):=20Added=20support=20for=20= --exclude-files=0Aand=20--exclude-directories.=0A(AUTHORS):=20updated.=0A= Doc=20fixes=0A*=20tests/chmod/exclude.sh=20(all=20new):=20tests=20for=20= --exclude-files=0Aand=20--exclude-directories.=0A=0A*=20src/chown.c=20= (enum,=20long_options,=20usage,=20main):=0AAdded=20support=20for=20= --exclude-files=20and=20--exclude-directories.=0A(AUTHORS):=20updated.=0A= Doc=20fixes=0A*=20src/chown-core.c=20(chopt_init,=20change_file_owner):=0A= Added=20support=20for=20--exclude-files=20and=20--exclude-directories.=0A= (AUTHORS):=20updated.=0ADoc=20fixes=0A*=20src/chown-core.h=20= (Chown_options):=20Added=20support=20for=0A--exclude-files=20and=20= --exclude-directories.=0A*=20tests/chown/exclude.sh=20(all=20new):=20= tests=20for=20--exclude-files=0Aand=20--exclude-directories.=0A=0A*=20= src/chgrp.c=20(enum,=20long_options,=20usage,=20main):=0AAdded=20support=20= for=20--exclude-files=20and=20--exclude-directories.=0A(AUTHORS):=20= updated.=0ADoc=20fixes=0A*=20tests/chgrp/exclude.sh=20(all=20new):=20= tests=20for=20--exclude-files=0Aand=20--exclude-directories.=0A---=0A=20= src/chgrp.c=20=20=20=20=20=20=20=20=20=20=20=20|=20=2063=20++++++----=0A=20= src/chmod.c=20=20=20=20=20=20=20=20=20=20=20=20|=20=2077=20++++++++++--=0A= =20src/chown-core.c=20=20=20=20=20=20=20|=20=2034=20+++++-=0A=20= src/chown-core.h=20=20=20=20=20=20=20|=20=20=206=20+=0A=20src/chown.c=20=20= =20=20=20=20=20=20=20=20=20=20|=20=2071=20++++++++----=0A=20= tests/chgrp/exclude.sh=20|=20309=20= +++++++++++++++++++++++++++++++++++++++++++++++++=0A=20= tests/chmod/exclude.sh=20|=20297=20= +++++++++++++++++++++++++++++++++++++++++++++++=0A=20= tests/chown/exclude.sh=20|=20307=20= ++++++++++++++++++++++++++++++++++++++++++++++++=0A=208=20files=20= changed,=201106=20insertions(+),=2058=20deletions(-)=0A=20create=20mode=20= 100644=20tests/chgrp/exclude.sh=0A=20create=20mode=20100644=20= tests/chmod/exclude.sh=0A=20create=20mode=20100644=20= tests/chown/exclude.sh=0A=0Adiff=20--git=20a/src/chgrp.c=20b/src/chgrp.c=0A= index=20130fa73dd..ac5c42421=20100644=0A---=20a/src/chgrp.c=0A+++=20= b/src/chgrp.c=0A@@=20-14,7=20+14,9=20@@=0A=20=20=20=20You=20should=20= have=20received=20a=20copy=20of=20the=20GNU=20General=20Public=20License=0A= =20=20=20=20along=20with=20this=20program.=20=20If=20not,=20see=20= .=20=20*/=0A=20=0A-/*=20Written=20by=20= David=20MacKenzie=20.=20*/=0A+/*=20Written=20by=20= David=20MacKenzie=20=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20Jim=20Meyering=20=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20Ian=20Morris=20Nieves=20=20*/=0A= =20=0A=20#include=20=0A=20#include=20=0A@@=20-36,7=20= +38,8=20@@=0A=20=0A=20#define=20AUTHORS=20\=0A=20=20=20proper_name=20= ("David=20MacKenzie"),=20\=0A-=20=20proper_name=20("Jim=20Meyering")=0A+=20= =20proper_name=20("Jim=20Meyering"),=20\=0A+=20=20proper_name=20("Ian=20= Morris=20Nieves")=0A=20=0A=20#if=20!=20HAVE_ENDGRENT=0A=20#=20define=20= endgrent()=20((void)=200)=0A@@=20-53,11=20+56,15=20@@=20enum=0A=20=20=20= DEREFERENCE_OPTION=20=3D=20CHAR_MAX=20+=201,=0A=20=20=20= NO_PRESERVE_ROOT,=0A=20=20=20PRESERVE_ROOT,=0A-=20=20= REFERENCE_FILE_OPTION=0A+=20=20REFERENCE_FILE_OPTION,=0A+=20=20= EXCLUDE_DIRECTORIES,=0A+=20=20EXCLUDE_FILES=0A=20};=0A=20=0A=20static=20= struct=20option=20const=20long_options[]=20=3D=0A=20{=0A+=20=20= {"exclude-directories",=20no_argument,=20NULL,=20EXCLUDE_DIRECTORIES},=0A= +=20=20{"exclude-files",=20no_argument,=20NULL,=20EXCLUDE_FILES},=0A=20=20= =20{"recursive",=20no_argument,=20NULL,=20'R'},=0A=20=20=20{"changes",=20= no_argument,=20NULL,=20'c'},=0A=20=20=20{"dereference",=20no_argument,=20= NULL,=20DEREFERENCE_OPTION},=0A@@=20-118,29=20+125,35=20@@=20With=20= --reference,=20change=20the=20group=20of=20each=20FILE=20to=20that=20of=20= RFILE.\n\=0A=20\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20= (_("\=0A-=20=20-c,=20--changes=20=20=20=20=20=20=20=20=20=20like=20= verbose=20but=20report=20only=20when=20a=20change=20is=20made\n\=0A-=20=20= -f,=20--silent,=20--quiet=20=20suppress=20most=20error=20messages\n\=0A-=20= =20-v,=20--verbose=20=20=20=20=20=20=20=20=20=20output=20a=20diagnostic=20= for=20every=20file=20processed\n\=0A+=20=20-c,=20--changes=20=20=20=20=20= =20=20=20=20=20=20=20=20=20like=20verbose=20but=20report=20only=20when=20= a=20change=20is=20made\n\=0A+=20=20-f,=20--silent,=20--quiet=20=20=20=20=20= =20suppress=20most=20error=20messages\n\=0A+=20=20-v,=20--verbose=20=20=20= =20=20=20=20=20=20=20=20=20=20=20output=20a=20diagnostic=20for=20every=20= file=20processed\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20= (_("\=0A-=20=20=20=20=20=20--dereference=20=20=20=20=20=20affect=20the=20= referent=20of=20each=20symbolic=20link=20(this=20is\n\=0A-=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20the=20= default),=20rather=20than=20the=20symbolic=20link=20itself\n\=0A-=20=20= -h,=20--no-dereference=20=20=20affect=20symbolic=20links=20instead=20of=20= any=20referenced=20file\n\=0A+=20=20=20=20=20=20--dereference=20=20=20=20= =20=20=20=20=20=20affect=20the=20referent=20of=20each=20symbolic=20link=20= (this=20is\n\=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20the=20default),=20rather=20than=20the=20= symbolic=20link=20itself\n\=0A+=20=20-h,=20--no-dereference=20=20=20=20=20= =20=20affect=20symbolic=20links=20instead=20of=20any=20referenced=20= file\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20(_("\=0A-=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (useful=20only=20on=20systems=20that=20can=20change=20the\n\=0A-=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ownership=20of=20a=20symlink)\n\=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(useful=20only=20on=20= systems=20that=20can=20change=20the\n\=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20ownership=20of=20a=20= symlink)\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20(_("\=0A-=20= =20=20=20=20=20--no-preserve-root=20=20do=20not=20treat=20'/'=20= specially=20(the=20default)\n\=0A-=20=20=20=20=20=20--preserve-root=20=20= =20=20fail=20to=20operate=20recursively=20on=20'/'\n\=0A+=20=20=20=20=20=20= --no-preserve-root=20=20=20=20=20do=20not=20treat=20'/'=20specially=20= (the=20default)\n\=0A+=20=20=20=20=20=20--preserve-root=20=20=20=20=20=20= =20=20fail=20to=20operate=20recursively=20on=20'/'\n\=0A=20"),=20= stdout);=0A=20=20=20=20=20=20=20fputs=20(_("\=0A-=20=20=20=20=20=20= --reference=3DRFILE=20=20use=20RFILE's=20group=20rather=20than=20= specifying=20a\n\=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20GROUP=20value\n\=0A+=20=20=20=20=20=20= --reference=3DRFILE=20=20=20=20=20=20use=20RFILE's=20group=20rather=20= than=20specifying=20a\n\=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20GROUP=20value\n\=0A=20"),=20= stdout);=0A=20=20=20=20=20=20=20fputs=20(_("\=0A-=20=20-R,=20--recursive=20= =20=20=20=20=20=20=20operate=20on=20files=20and=20directories=20= recursively\n\=0A+=20=20=20=20=20=20--exclude-directories=20=20don't=20= change=20directories\n\=0A+"),=20stdout);=0A+=20=20=20=20=20=20fputs=20= (_("\=0A+=20=20=20=20=20=20--exclude-files=20=20=20=20=20=20=20=20don't=20= change=20files\n\=0A+"),=20stdout);=0A+=20=20=20=20=20=20fputs=20(_("\=0A= +=20=20-R,=20--recursive=20=20=20=20=20=20=20=20=20=20=20=20operate=20on=20= files=20and=20directories=20recursively\n\=0A=20"),=20stdout);=0A=20=20=20= =20=20=20=20fputs=20(_("\=0A=20\n\=0A@@=20-148,11=20+161,11=20@@=20The=20= following=20options=20modify=20how=20a=20hierarchy=20is=20traversed=20= when=20the=20-R\n\=0A=20option=20is=20also=20specified.=20=20If=20more=20= than=20one=20is=20specified,=20only=20the=20final\n\=0A=20one=20takes=20= effect.\n\=0A=20\n\=0A-=20=20-H=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20if=20a=20command=20line=20argument=20is=20a=20= symbolic=20link\n\=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20to=20a=20directory,=20traverse=20it\n\=0A-=20=20= -L=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= traverse=20every=20symbolic=20link=20to=20a=20directory\n\=0A-=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= encountered\n\=0A-=20=20-P=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20do=20not=20traverse=20any=20symbolic=20links=20= (default)\n\=0A+=20=20-H=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20if=20a=20command=20line=20argument=20is=20a=20= symbolic=20link\n\=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20to=20a=20directory,=20traverse=20= it\n\=0A+=20=20-L=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20traverse=20every=20symbolic=20link=20to=20a=20= directory\n\=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20encountered\n\=0A+=20=20-P=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20do=20not=20= traverse=20any=20symbolic=20links=20(default)\n\=0A=20\n\=0A=20"),=20= stdout);=0A=20=20=20=20=20=20=20fputs=20(HELP_OPTION_DESCRIPTION,=20= stdout);=0A@@=20-234,6=20+247,14=20@@=20main=20(int=20argc,=20char=20= **argv)=0A=20=20=20=20=20=20=20=20=20=20=20reference_file=20=3D=20= optarg;=0A=20=20=20=20=20=20=20=20=20=20=20break;=0A=20=0A+=20=20=20=20=20= =20=20=20case=20EXCLUDE_DIRECTORIES:=0A+=20=20=20=20=20=20=20=20=20=20= chopt.exclude_directories=20=3D=20true;=0A+=20=20=20=20=20=20=20=20=20=20= break;=0A+=0A+=20=20=20=20=20=20=20=20case=20EXCLUDE_FILES:=0A+=20=20=20=20= =20=20=20=20=20=20chopt.exclude_files=20=3D=20true;=0A+=20=20=20=20=20=20= =20=20=20=20break;=0A+=0A=20=20=20=20=20=20=20=20=20case=20'R':=0A=20=20=20= =20=20=20=20=20=20=20=20chopt.recurse=20=3D=20true;=0A=20=20=20=20=20=20=20= =20=20=20=20break;=0Adiff=20--git=20a/src/chmod.c=20b/src/chmod.c=0A= index=200e9436c72..cfb20f335=20100644=0A---=20a/src/chmod.c=0A+++=20= b/src/chmod.c=0A@@=20-14,7=20+14,9=20@@=0A=20=20=20=20You=20should=20= have=20received=20a=20copy=20of=20the=20GNU=20General=20Public=20License=0A= =20=20=20=20along=20with=20this=20program.=20=20If=20not,=20see=20= .=20=20*/=0A=20=0A-/*=20Written=20by=20= David=20MacKenzie=20=20*/=0A+/*=20Written=20by=20= David=20MacKenzie=20=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20Jim=20Meyering=20=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20Ian=20Morris=20Nieves=20=20*/=0A= =20=0A=20#include=20=0A=20#include=20=0A@@=20-37,7=20= +39,8=20@@=0A=20=0A=20#define=20AUTHORS=20\=0A=20=20=20proper_name=20= ("David=20MacKenzie"),=20\=0A-=20=20proper_name=20("Jim=20Meyering")=0A+=20= =20proper_name=20("Jim=20Meyering"),=20\=0A+=20=20proper_name=20("Ian=20= Morris=20Nieves")=0A=20=0A=20enum=20Change_status=0A=20{=0A@@=20-68,6=20= +71,12=20@@=20static=20mode_t=20umask_value;=0A=20/*=20If=20true,=20= change=20the=20modes=20of=20directories=20recursively.=20*/=0A=20static=20= bool=20recurse;=0A=20=0A+/*=20If=20true,=20don't=20change=20the=20modes=20= of=20files.=20*/=0A+static=20bool=20exclude_files;=0A+=0A+/*=20If=20= true,=20don't=20change=20the=20modes=20of=20directories.=20*/=0A+static=20= bool=20exclude_directories;=0A+=0A=20/*=20If=20true,=20force=20silence=20= (suppress=20most=20of=20error=20messages).=20*/=0A=20static=20bool=20= force_silent;=0A=20=0A@@=20-89,12=20+98,16=20@@=20enum=0A=20{=0A=20=20=20= NO_PRESERVE_ROOT=20=3D=20CHAR_MAX=20+=201,=0A=20=20=20PRESERVE_ROOT,=0A-=20= =20REFERENCE_FILE_OPTION=0A+=20=20REFERENCE_FILE_OPTION,=0A+=20=20= EXCLUDE_DIRECTORIES,=0A+=20=20EXCLUDE_FILES=0A=20};=0A=20=0A=20static=20= struct=20option=20const=20long_options[]=20=3D=0A=20{=0A=20=20=20= {"changes",=20no_argument,=20NULL,=20'c'},=0A+=20=20= {"exclude-directories",=20no_argument,=20NULL,=20EXCLUDE_DIRECTORIES},=0A= +=20=20{"exclude-files",=20no_argument,=20NULL,=20EXCLUDE_FILES},=0A=20=20= =20{"recursive",=20no_argument,=20NULL,=20'R'},=0A=20=20=20= {"no-preserve-root",=20no_argument,=20NULL,=20NO_PRESERVE_ROOT},=0A=20=20= =20{"preserve-root",=20no_argument,=20NULL,=20PRESERVE_ROOT},=0A@@=20= -195,6=20+208,35=20@@=20process_file=20(FTS=20*fts,=20FTSENT=20*ent)=0A=20= =20=20bool=20ok=20=3D=20true;=0A=20=20=20bool=20chmod_succeeded=20=3D=20= false;=0A=20=0A+=20=20if=20(exclude_directories)=0A+=20=20=20=20{=0A+=20=20= =20=20=20=20switch=20(ent->fts_info)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20= =20=20=20=20=20=20=20=20case=20FTS_D:=0A+=20=20=20=20=20=20=20=20=20=20= case=20FTS_DC:=0A+=20=20=20=20=20=20=20=20=20=20case=20FTS_DNR:=0A+=20=20= =20=20=20=20=20=20=20=20case=20FTS_DOT:=0A+=20=20=20=20=20=20=20=20=20=20= case=20FTS_DP:=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=20true;=0A+=20= =20=20=20=20=20=20=20=20=20default:=0A+=20=20=20=20=20=20=20=20=20=20=20=20= break;=0A+=20=20=20=20=20=20=20=20}=0A+=20=20=20=20}=0A+=0A+=20=20if=20= (exclude_files)=0A+=20=20=20=20{=0A+=20=20=20=20=20=20switch=20= (ent->fts_info)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20case=20FTS_DEFAULT:=0A+=20=20=20=20=20=20=20=20=20=20case=20FTS_F:=0A= +=20=20=20=20=20=20=20=20=20=20case=20FTS_NS:=0A+=20=20=20=20=20=20=20=20= =20=20case=20FTS_NSOK:=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=20= true;=0A+=20=20=20=20=20=20=20=20=20=20default:=0A+=20=20=20=20=20=20=20=20= =20=20=20=20break;=0A+=20=20=20=20=20=20=20=20}=0A+=20=20=20=20}=0A+=0A=20= =20=20switch=20(ent->fts_info)=0A=20=20=20=20=20{=0A=20=20=20=20=20case=20= FTS_DP:=0A@@=20-340,6=20+382,7=20@@=20process_files=20(char=20**files,=20= int=20bit_flags)=0A=20=20=20=20=20=20=20FTSENT=20*ent;=0A=20=0A=20=20=20=20= =20=20=20ent=20=3D=20fts_read=20(fts);=0A+=0A=20=20=20=20=20=20=20if=20= (ent=20=3D=3D=20NULL)=0A=20=20=20=20=20=20=20=20=20{=0A=20=20=20=20=20=20= =20=20=20=20=20if=20(errno=20!=3D=200)=0A@@=20-383,19=20+426,25=20@@=20= With=20--reference,=20change=20the=20mode=20of=20each=20FILE=20to=20that=20= of=20RFILE.\n\=0A=20\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20= (_("\=0A-=20=20-c,=20--changes=20=20=20=20=20=20=20=20=20=20like=20= verbose=20but=20report=20only=20when=20a=20change=20is=20made\n\=0A-=20=20= -f,=20--silent,=20--quiet=20=20suppress=20most=20error=20messages\n\=0A-=20= =20-v,=20--verbose=20=20=20=20=20=20=20=20=20=20output=20a=20diagnostic=20= for=20every=20file=20processed\n\=0A+=20=20-c,=20--changes=20=20=20=20=20= =20=20=20=20=20=20=20=20=20like=20verbose=20but=20report=20only=20when=20= a=20change=20is=20made\n\=0A+=20=20-f,=20--silent,=20--quiet=20=20=20=20=20= =20suppress=20most=20error=20messages\n\=0A+=20=20-v,=20--verbose=20=20=20= =20=20=20=20=20=20=20=20=20=20=20output=20a=20diagnostic=20for=20every=20= file=20processed\n\=0A+"),=20stdout);=0A+=20=20=20=20=20=20fputs=20(_("\=0A= +=20=20=20=20=20=20--no-preserve-root=20=20=20=20=20do=20not=20treat=20= '/'=20specially=20(the=20default)\n\=0A+=20=20=20=20=20=20= --preserve-root=20=20=20=20=20=20=20=20fail=20to=20operate=20recursively=20= on=20'/'\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20(_("\=0A-=20= =20=20=20=20=20--no-preserve-root=20=20do=20not=20treat=20'/'=20= specially=20(the=20default)\n\=0A-=20=20=20=20=20=20--preserve-root=20=20= =20=20fail=20to=20operate=20recursively=20on=20'/'\n\=0A+=20=20=20=20=20=20= --reference=3DRFILE=20=20=20=20=20=20use=20RFILE's=20mode=20instead=20of=20= MODE=20values\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20= (_("\=0A-=20=20=20=20=20=20--reference=3DRFILE=20=20use=20RFILE's=20mode=20= instead=20of=20MODE=20values\n\=0A+=20=20=20=20=20=20= --exclude-directories=20=20don't=20change=20directories\n\=0A=20"),=20= stdout);=0A=20=20=20=20=20=20=20fputs=20(_("\=0A-=20=20-R,=20--recursive=20= =20=20=20=20=20=20=20change=20files=20and=20directories=20recursively\n\=0A= +=20=20=20=20=20=20--exclude-files=20=20=20=20=20=20=20=20don't=20change=20= files\n\=0A+"),=20stdout);=0A+=20=20=20=20=20=20fputs=20(_("\=0A+=20=20= -R,=20--recursive=20=20=20=20=20=20=20=20=20=20=20=20change=20files=20= and=20directories=20recursively\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20= =20fputs=20(HELP_OPTION_DESCRIPTION,=20stdout);=0A=20=20=20=20=20=20=20= fputs=20(VERSION_OPTION_DESCRIPTION,=20stdout);=0A@@=20-430,7=20+479,7=20= @@=20main=20(int=20argc,=20char=20**argv)=0A=20=0A=20=20=20atexit=20= (close_stdout);=0A=20=0A-=20=20recurse=20=3D=20force_silent=20=3D=20= diagnose_surprises=20=3D=20false;=0A+=20=20recurse=20=3D=20exclude_files=20= =3D=20exclude_directories=20=3D=20force_silent=20=3D=20= diagnose_surprises=20=3D=20false;=0A=20=0A=20=20=20while=20((c=20=3D=20= getopt_long=20(argc,=20argv,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20= ("Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=3D::"=0A@@=20-490,6=20+539,12=20= @@=20main=20(int=20argc,=20char=20**argv)=0A=20=20=20=20=20=20=20=20=20= case=20REFERENCE_FILE_OPTION:=0A=20=20=20=20=20=20=20=20=20=20=20= reference_file=20=3D=20optarg;=0A=20=20=20=20=20=20=20=20=20=20=20break;=0A= +=20=20=20=20=20=20=20=20case=20EXCLUDE_DIRECTORIES:=0A+=20=20=20=20=20=20= =20=20=20=20exclude_directories=20=3D=20true;=0A+=20=20=20=20=20=20=20=20= =20=20break;=0A+=20=20=20=20=20=20=20=20case=20EXCLUDE_FILES:=0A+=20=20=20= =20=20=20=20=20=20=20exclude_files=20=3D=20true;=0A+=20=20=20=20=20=20=20= =20=20=20break;=0A=20=20=20=20=20=20=20=20=20case=20'R':=0A=20=20=20=20=20= =20=20=20=20=20=20recurse=20=3D=20true;=0A=20=20=20=20=20=20=20=20=20=20=20= break;=0Adiff=20--git=20a/src/chown-core.c=20b/src/chown-core.c=0Aindex=20= 818ee0ff1..c1d59b873=20100644=0A---=20a/src/chown-core.c=0A+++=20= b/src/chown-core.c=0A@@=20-14,7=20+14,8=20@@=0A=20=20=20=20You=20should=20= have=20received=20a=20copy=20of=20the=20GNU=20General=20Public=20License=0A= =20=20=20=20along=20with=20this=20program.=20=20If=20not,=20see=20= .=20=20*/=0A=20=0A-/*=20Extracted=20from=20= chown.c/chgrp.c=20and=20librarified=20by=20Jim=20Meyering.=20=20*/=0A+/*=20= Extracted=20from=20chown.c/chgrp.c=20and=20librarified=20by=20Jim=20= Meyering.=0A+=20=20=20Added=20to=20by=20Ian=20Morris=20Nieves=20= =20*/=0A=20=0A=20#include=20=0A=20= #include=20=0A@@=20-61,6=20+62,8=20@@=20chopt_init=20(struct=20= Chown_option=20*chopt)=0A=20=20=20chopt->root_dev_ino=20=3D=20NULL;=0A=20= =20=20chopt->affect_symlink_referent=20=3D=20true;=0A=20=20=20= chopt->recurse=20=3D=20false;=0A+=20=20chopt->exclude_files=20=3D=20= false;=0A+=20=20chopt->exclude_directories=20=3D=20false;=0A=20=20=20= chopt->force_silent=20=3D=20false;=0A=20=20=20chopt->user_name=20=3D=20= NULL;=0A=20=20=20chopt->group_name=20=3D=20NULL;=0A@@=20-281,6=20+284,35=20= @@=20change_file_owner=20(FTS=20*fts,=20FTSENT=20*ent,=0A=20=20=20bool=20= do_chown;=0A=20=20=20bool=20symlink_changed=20=3D=20true;=0A=20=0A+=20=20= if=20(chopt->exclude_directories)=0A+=20=20=20=20{=0A+=20=20=20=20=20=20= switch=20(ent->fts_info)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20= =20=20=20=20case=20FTS_D:=0A+=20=20=20=20=20=20=20=20=20=20case=20= FTS_DC:=0A+=20=20=20=20=20=20=20=20=20=20case=20FTS_DNR:=0A+=20=20=20=20=20= =20=20=20=20=20case=20FTS_DOT:=0A+=20=20=20=20=20=20=20=20=20=20case=20= FTS_DP:=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=20true;=0A+=20=20=20= =20=20=20=20=20=20=20default:=0A+=20=20=20=20=20=20=20=20=20=20=20=20= break;=0A+=20=20=20=20=20=20=20=20}=0A+=20=20=20=20}=0A+=0A+=20=20if=20= (chopt->exclude_files)=0A+=20=20=20=20{=0A+=20=20=20=20=20=20switch=20= (ent->fts_info)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20case=20FTS_DEFAULT:=0A+=20=20=20=20=20=20=20=20=20=20case=20FTS_F:=0A= +=20=20=20=20=20=20=20=20=20=20case=20FTS_NS:=0A+=20=20=20=20=20=20=20=20= =20=20case=20FTS_NSOK:=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=20= true;=0A+=20=20=20=20=20=20=20=20=20=20default:=0A+=20=20=20=20=20=20=20=20= =20=20=20=20break;=0A+=20=20=20=20=20=20=20=20}=0A+=20=20=20=20}=0A+=0A=20= =20=20switch=20(ent->fts_info)=0A=20=20=20=20=20{=0A=20=20=20=20=20case=20= FTS_D:=0Adiff=20--git=20a/src/chown-core.h=20b/src/chown-core.h=0Aindex=20= 26d702e2c..2e0ae053f=20100644=0A---=20a/src/chown-core.h=0A+++=20= b/src/chown-core.h=0A@@=20-45,6=20+45,12=20@@=20struct=20Chown_option=0A=20= =20=20/*=20Level=20of=20verbosity.=20=20*/=0A=20=20=20enum=20Verbosity=20= verbosity;=0A=20=0A+=20=20/*=20If=20nonzero,=20don't=20change=20the=20= ownership=20of=20files.=20*/=0A+=20=20bool=20exclude_files;=0A+=0A+=20=20= /*=20If=20nonzero,=20don't=20change=20the=20ownership=20of=20= directories.=20*/=0A+=20=20bool=20exclude_directories;=0A+=0A=20=20=20/*=20= If=20nonzero,=20change=20the=20ownership=20of=20directories=20= recursively.=20*/=0A=20=20=20bool=20recurse;=0A=20=0Adiff=20--git=20= a/src/chown.c=20b/src/chown.c=0Aindex=20da6ed4ab4..7df542328=20100644=0A= ---=20a/src/chown.c=0A+++=20b/src/chown.c=0A@@=20-14,7=20+14,9=20@@=0A=20= =20=20=20You=20should=20have=20received=20a=20copy=20of=20the=20GNU=20= General=20Public=20License=0A=20=20=20=20along=20with=20this=20program.=20= =20If=20not,=20see=20.=20=20*/=0A=20=0A= -/*=20Written=20by=20David=20MacKenzie=20.=20*/=0A= +/*=20Written=20by=20David=20MacKenzie=20=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20Jim=20Meyering=20=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20Ian=20Morris=20Nieves=20= =20*/=0A=20=0A=20#include=20=0A=20= #include=20=0A@@=20-35,7=20+37,8=20@@=0A=20=0A=20#define=20= AUTHORS=20\=0A=20=20=20proper_name=20("David=20MacKenzie"),=20\=0A-=20=20= proper_name=20("Jim=20Meyering")=0A+=20=20proper_name=20("Jim=20= Meyering"),=20\=0A+=20=20proper_name=20("Ian=20Morris=20Nieves")=0A=20=0A= =20/*=20The=20argument=20to=20the=20--reference=20option.=20=20Use=20the=20= owner=20and=20group=20IDs=0A=20=20=20=20of=20this=20file.=20=20This=20= file=20must=20exist.=20=20*/=0A@@=20-49,11=20+52,15=20@@=20enum=0A=20=20=20= FROM_OPTION,=0A=20=20=20NO_PRESERVE_ROOT,=0A=20=20=20PRESERVE_ROOT,=0A-=20= =20REFERENCE_FILE_OPTION=0A+=20=20REFERENCE_FILE_OPTION,=0A+=20=20= EXCLUDE_DIRECTORIES,=0A+=20=20EXCLUDE_FILES=0A=20};=0A=20=0A=20static=20= struct=20option=20const=20long_options[]=20=3D=0A=20{=0A+=20=20= {"exclude-directories",=20no_argument,=20NULL,=20EXCLUDE_DIRECTORIES},=0A= +=20=20{"exclude-files",=20no_argument,=20NULL,=20EXCLUDE_FILES},=0A=20=20= =20{"recursive",=20no_argument,=20NULL,=20'R'},=0A=20=20=20{"changes",=20= no_argument,=20NULL,=20'c'},=0A=20=20=20{"dereference",=20no_argument,=20= NULL,=20DEREFERENCE_OPTION},=0A@@=20-88,36=20+95,42=20@@=20With=20= --reference,=20change=20the=20owner=20and=20group=20of=20each=20FILE=20= to=20those=20of=20RFILE.\n\=0A=20\n\=0A=20"),=20stdout);=0A=20=20=20=20=20= =20=20fputs=20(_("\=0A-=20=20-c,=20--changes=20=20=20=20=20=20=20=20=20=20= like=20verbose=20but=20report=20only=20when=20a=20change=20is=20made\n\=0A= -=20=20-f,=20--silent,=20--quiet=20=20suppress=20most=20error=20= messages\n\=0A-=20=20-v,=20--verbose=20=20=20=20=20=20=20=20=20=20output=20= a=20diagnostic=20for=20every=20file=20processed\n\=0A+=20=20-c,=20= --changes=20=20=20=20=20=20=20=20=20=20=20=20=20=20like=20verbose=20but=20= report=20only=20when=20a=20change=20is=20made\n\=0A+=20=20-f,=20= --silent,=20--quiet=20=20=20=20=20=20suppress=20most=20error=20= messages\n\=0A+=20=20-v,=20--verbose=20=20=20=20=20=20=20=20=20=20=20=20=20= =20output=20a=20diagnostic=20for=20every=20file=20processed\n\=0A=20"),=20= stdout);=0A=20=20=20=20=20=20=20fputs=20(_("\=0A-=20=20=20=20=20=20= --dereference=20=20=20=20=20=20affect=20the=20referent=20of=20each=20= symbolic=20link=20(this=20is\n\=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20the=20default),=20rather=20than=20= the=20symbolic=20link=20itself\n\=0A-=20=20-h,=20--no-dereference=20=20=20= affect=20symbolic=20links=20instead=20of=20any=20referenced=20file\n\=0A= +=20=20=20=20=20=20--dereference=20=20=20=20=20=20=20=20=20=20affect=20= the=20referent=20of=20each=20symbolic=20link=20(this=20is\n\=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20the=20default),=20rather=20than=20the=20symbolic=20link=20itself\n\=0A= +=20=20-h,=20--no-dereference=20=20=20=20=20=20=20affect=20symbolic=20= links=20instead=20of=20any=20referenced=20file\n\=0A=20"),=20stdout);=0A=20= =20=20=20=20=20=20fputs=20(_("\=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(useful=20only=20on=20systems=20that=20= can=20change=20the\n\=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20ownership=20of=20a=20symlink)\n\=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (useful=20only=20on=20systems=20that=20can=20change=20the\n\=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20ownership=20of=20a=20symlink)\n\=0A=20"),=20stdout);=0A=20=20=20=20=20= =20=20fputs=20(_("\=0A=20=20=20=20=20=20=20= --from=3DCURRENT_OWNER:CURRENT_GROUP\n\=0A-=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20change=20the=20owner=20= and/or=20group=20of=20each=20file=20only=20if\n\=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20its=20current=20= owner=20and/or=20group=20match=20those=20specified\n\=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20here.=20=20= Either=20may=20be=20omitted,=20in=20which=20case=20a=20match\n\=0A-=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20is=20= not=20required=20for=20the=20omitted=20attribute\n\=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= change=20the=20owner=20and/or=20group=20of=20each=20file=20only=20if\n\=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20its=20current=20owner=20and/or=20group=20match=20those=20= specified\n\=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20here.=20=20Either=20may=20be=20omitted,=20= in=20which=20case=20a=20match\n\=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20is=20not=20required=20= for=20the=20omitted=20attribute\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20= =20fputs=20(_("\=0A-=20=20=20=20=20=20--no-preserve-root=20=20do=20not=20= treat=20'/'=20specially=20(the=20default)\n\=0A-=20=20=20=20=20=20= --preserve-root=20=20=20=20fail=20to=20operate=20recursively=20on=20= '/'\n\=0A+=20=20=20=20=20=20--no-preserve-root=20=20=20=20=20do=20not=20= treat=20'/'=20specially=20(the=20default)\n\=0A+=20=20=20=20=20=20= --preserve-root=20=20=20=20=20=20=20=20fail=20to=20operate=20recursively=20= on=20'/'\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20(_("\=0A-=20= =20=20=20=20=20--reference=3DRFILE=20=20use=20RFILE's=20owner=20and=20= group=20rather=20than\n\=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20specifying=20OWNER:GROUP=20values\n\=0A+=20= =20=20=20=20=20--reference=3DRFILE=20=20=20=20=20=20use=20RFILE's=20= owner=20and=20group=20rather=20than\n\=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20specifying=20= OWNER:GROUP=20values\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20fputs=20= (_("\=0A-=20=20-R,=20--recursive=20=20=20=20=20=20=20=20operate=20on=20= files=20and=20directories=20recursively\n\=0A+=20=20=20=20=20=20= --exclude-directories=20=20don't=20change=20directories\n\=0A+"),=20= stdout);=0A+=20=20=20=20=20=20fputs=20(_("\=0A+=20=20=20=20=20=20= --exclude-files=20=20=20=20=20=20=20=20don't=20change=20files\n\=0A+"),=20= stdout);=0A+=20=20=20=20=20=20fputs=20(_("\=0A+=20=20-R,=20--recursive=20= =20=20=20=20=20=20=20=20=20=20=20operate=20on=20files=20and=20= directories=20recursively\n\=0A=20"),=20stdout);=0A=20=20=20=20=20=20=20= fputs=20(_("\=0A=20\n\=0A@@=20-125,11=20+138,11=20@@=20The=20following=20= options=20modify=20how=20a=20hierarchy=20is=20traversed=20when=20the=20= -R\n\=0A=20option=20is=20also=20specified.=20=20If=20more=20than=20one=20= is=20specified,=20only=20the=20final\n\=0A=20one=20takes=20effect.\n\=0A=20= \n\=0A-=20=20-H=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20if=20a=20command=20line=20argument=20is=20a=20symbolic=20link\n\=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= to=20a=20directory,=20traverse=20it\n\=0A-=20=20-L=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20traverse=20every=20symbolic=20= link=20to=20a=20directory\n\=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20encountered\n\=0A-=20=20-P=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20do=20not=20traverse=20= any=20symbolic=20links=20(default)\n\=0A+=20=20-H=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20a=20command=20= line=20argument=20is=20a=20symbolic=20link\n\=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20to=20a=20= directory,=20traverse=20it\n\=0A+=20=20-L=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20traverse=20every=20symbolic=20= link=20to=20a=20directory\n\=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20encountered\n\=0A+=20=20-P=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= do=20not=20traverse=20any=20symbolic=20links=20(default)\n\=0A=20\n\=0A=20= "),=20stdout);=0A=20=20=20=20=20=20=20fputs=20(HELP_OPTION_DESCRIPTION,=20= stdout);=0A@@=20-235,6=20+248,14=20@@=20main=20(int=20argc,=20char=20= **argv)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20break;=0A=20=20=20=20=20= =20=20=20=20=20=20}=0A=20=0A+=20=20=20=20=20=20=20=20case=20= EXCLUDE_DIRECTORIES:=0A+=20=20=20=20=20=20=20=20=20=20= chopt.exclude_directories=20=3D=20true;=0A+=20=20=20=20=20=20=20=20=20=20= break;=0A+=0A+=20=20=20=20=20=20=20=20case=20EXCLUDE_FILES:=0A+=20=20=20=20= =20=20=20=20=20=20chopt.exclude_files=20=3D=20true;=0A+=20=20=20=20=20=20= =20=20=20=20break;=0A+=0A=20=20=20=20=20=20=20=20=20case=20'R':=0A=20=20=20= =20=20=20=20=20=20=20=20chopt.recurse=20=3D=20true;=0A=20=20=20=20=20=20=20= =20=20=20=20break;=0Adiff=20--git=20a/tests/chgrp/exclude.sh=20= b/tests/chgrp/exclude.sh=0Anew=20file=20mode=20100644=0Aindex=20= 000000000..ccd8f4b7e=0A---=20/dev/null=0A+++=20b/tests/chgrp/exclude.sh=0A= @@=20-0,0=20+1,309=20@@=0A+#!/bin/sh=0A+#=20Make=20sure=20GNU=20chgrp=20= works=20the=20same=20way=20as=20those=20of=20Solaris,=20HPUX,=20AIX=0A+#=20= on=20directories=20with=20the=20setgid=20bit=20set.=20=20Also,=20check=20= that=20the=20GNU=20octal=0A+#=20notations=20work.=0A+=0A+#=20Copyright=20= (C)=202001-2018=20Free=20Software=20Foundation,=20Inc.=0A+=0A+#=20This=20= program=20is=20free=20software:=20you=20can=20redistribute=20it=20and/or=20= modify=0A+#=20it=20under=20the=20terms=20of=20the=20GNU=20General=20= Public=20License=20as=20published=20by=0A+#=20the=20Free=20Software=20= Foundation,=20either=20version=203=20of=20the=20License,=20or=0A+#=20(at=20= your=20option)=20any=20later=20version.=0A+=0A+#=20This=20program=20is=20= distributed=20in=20the=20hope=20that=20it=20will=20be=20useful,=0A+#=20= but=20WITHOUT=20ANY=20WARRANTY;=20without=20even=20the=20implied=20= warranty=20of=0A+#=20MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20= PARTICULAR=20PURPOSE.=20=20See=20the=0A+#=20GNU=20General=20Public=20= License=20for=20more=20details.=0A+=0A+#=20You=20should=20have=20= received=20a=20copy=20of=20the=20GNU=20General=20Public=20License=0A+#=20= along=20with=20this=20program.=20=20If=20not,=20see=20= .=0A+=0A+.=20"${srcdir=3D.}/tests/init.sh";= =20path_prepend_=20./src=0A+print_ver_=20chgrp=0A+=0A= +require_membership_in_two_groups_=0A+=0A+set=20_=20$groups;=20shift=0A= +g1=3D$1=0A+g2=3D$2=0A+=0A+#=20when=20called=20on=20a=20single=20= directory=0A+#=20check=20--exclude-files=20excludes=20nothing=0A+#=20and=20= --exclude-directories=20excludes=20the=20directory=0A+=0A+#=20create=20= directory=20with=20group=20g1=20and=20check=0A+mkdir=20d=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +chgrp=20$g1=20d=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%g=20d)=20=3D=20$g1=20||=20= fail=3D1=0A+#=20change=20group=20to=20g2=20and=20check=0A+chgrp=20$g2=20= d=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%g=20d)=20=3D=20$g2=20||=20= fail=3D1=0A+#=20change=20group=20back=20to=20g1=20with=20= --exclude-directories=0A+#=20and=20check=20unchanged=0A+chgrp=20= --exclude-directories=20$g1=20d=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%g=20d)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A+#=20= change=20group=20back=20to=20g1=20with=20--exclude-files=0A+#=20and=20= check=20changed=0A+chgrp=20--exclude-files=20$g1=20d=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d)=20=3D=20$g1=20||=20fail=3D1=0A+#=20= cleanup=0A+rm=20-rf=20d=20||=20framework_failure_=0A+=0A+#=20when=20= called=20on=20a=20single=20file=0A+#=20check=20--exclude-directories=20= excludes=20nothing=0A+#=20and=20--exclude-files=20excludes=20the=20file=0A= +=0A+#=20create=20file=20with=20group=20g1=20and=20check=0A+touch=20f=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+chgrp=20$g1=20f=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20f)=20= =3D=20$g1=20||=20fail=3D1=0A+#=20change=20group=20to=20g2=20and=20check=0A= +chgrp=20$g2=20f=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%g=20f)=20=3D=20$g2=20||=20= fail=3D1=0A+#=20change=20group=20back=20to=20g1=20with=20--exclude-files=0A= +#=20and=20check=20unchanged=0A+chgrp=20--exclude-files=20$g1=20f=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%g=20f)=20=3D=20$g2=20||=20fail=3D1=0A= +#=20change=20group=20back=20to=20g1=20with=20--exclude-directories=0A+#=20= and=20check=20changed=0A+chgrp=20--exclude-directories=20$g1=20f=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%g=20f)=20=3D=20$g1=20=20=20=20=20=20=20= ||=20fail=3D1=0A+#=20cleanup=0A+rm=20-f=20f=20||=20framework_failure_=0A= +=0A+#=20when=20called=20on=20a=20directory=20with=20recursion=20(-R)=0A= +#=20check=20--exclude-directories=20excludes=20directories=20only=0A+#=20= and=20--exclude-files=20excludes=20files=20only=0A+#=20and=20combined=20= they=20exclude=20everything=0A+=0A+#=20create=20directory=20with=20a=20= child=20file=0A+#=20and=20child=20directory=20within=0A+mkdir=20d=20=20=20= ||=20framework_failure_=0A+touch=20d/f=20||=20framework_failure_=0A= +mkdir=20d/d=20||=20framework_failure_=0A+#=20set=20group=20of=20parent=20= directory=20to=20g1=0A+#=20and=20check=0A+chgrp=20$g1=20d=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d)=20=3D=20$g1=20||=20fail=3D1=0A+#=20set=20group=20= of=20child=20file=20to=20g1=0A+#=20and=20check=0A+chgrp=20$g1=20d/f=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +test=20$(stat=20--p=3D%g=20d/f)=20=3D=20$g1=20||=20fail=3D1=0A+#=20set=20= group=20of=20child=20directory=20to=20g1=0A+#=20and=20check=0A+chgrp=20= $g1=20d/d=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%g=20d/d)=20=3D=20$g1=20||=20= fail=3D1=0A+#=20recursively=20set=20all=20to=20g2=20with=20= --exclude-files=0A+#=20and=20check=20file=20unchanged=0A+chgrp=20-R=20= --exclude-files=20$g2=20d=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20= d)=20=3D=20$g2=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20= d/f)=20=3D=20$g1=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d/d)=20= =3D=20$g2=20=20||=20fail=3D1=0A+#=20set=20child=20file=20to=20g2=20and=20= check=0A+chgrp=20$g2=20d/f=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20d/f)=20=3D=20= $g2=20||=20framework_failure_=0A+#=20recursively=20set=20all=20to=20g1=20= with=20--exclude-directories=0A+#=20and=20check=20directory=20unchanged=0A= +chgrp=20-R=20--exclude-directories=20$g1=20d=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d)=20=3D=20$g2=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%g=20d/f)=20=3D=20$g1=20=20=20=20=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d/d)=20=3D=20$g2=20=20=20= =20=20=20=20=20||=20fail=3D1=0A+#=20set=20child=20file=20to=20g2=20and=20= check=0A+chgrp=20$g2=20d/f=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20d/f)=20=3D=20= $g2=20||=20framework_failure_=0A+#=20recursively=20set=20all=20to=20g1=20= with=20--exclude-files=0A+#=20and=20--exclude-directories=20and=20check=20= all=20unchanged=0A+chgrp=20-R=20--exclude-files=20--exclude-directories=20= $g1=20d=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d)=20=3D=20$g2=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d/f)=20=3D=20$g2=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d/d)=20=3D=20$g2=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+#=20cleanup=0A= +rm=20-rf=20d=20||=20framework_failure_=0A+=0A+#=20when=20called=20on=20= a=20directory=20with=20recursion=20(-R)=0A+#=20and=20default=20of=20do=20= not=20follow=20symlinks=20(-P)=0A+#=20check=20--exclude-directories=20= excludes=20directories=20only=0A+#=20and=20--exclude-files=20excludes=20= files=20only=0A+#=20and=20combined=20they=20exclude=20everything=0A+#=20= and=20symlink=20referents=20are=20affected=20but=20not=20the=20symlink=0A= +#=20and=20symlinks=20are=20not=20traversed=0A+#=20using=20structure:=0A= +#=0A+#=20=20=20d1=0A+#=20=20=20=20=20f2=0A+#=20=20=20f3=0A+#=20=20=20d4=0A= +#=20=20=20=20=20d5=0A+#=20=20=20=20=20f6=0A+#=20=20=20=20=20s7=20->=20= d1=0A+#=20=20=20=20=20s8=20->=20f3=0A+=0A+#=20create=20structure=0A= +mkdir=20d1=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +touch=20d1/f2=20=20=20=20=20=20=20||=20framework_failure_=0A+touch=20f3=20= =20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+mkdir=20d4=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+mkdir=20d4/d5=20=20=20=20= =20=20=20||=20framework_failure_=0A+touch=20d4/f6=20=20=20=20=20=20=20||=20= framework_failure_=0A+ln=20-s=20../d1=20d4/s7=20||=20framework_failure_=0A= +ln=20-s=20../f3=20d4/s8=20||=20framework_failure_=0A+#=20set=20= structure=20to=20group=20g1=0A+chgrp=20-R=20$g1=20d1=20||=20= framework_failure_=0A+chgrp=20$g1=20f3=20=20=20=20||=20= framework_failure_=0A+chgrp=20$g1=20d4=20=20=20=20||=20= framework_failure_=0A+chgrp=20$g1=20d4/d5=20||=20framework_failure_=0A= +chgrp=20$g1=20d4/f6=20||=20framework_failure_=0A+chgrp=20$g1=20d4/s7=20= ||=20framework_failure_=0A+chgrp=20$g1=20d4/s8=20||=20framework_failure_=0A= +#=20check=20groups=20set=20to=20g1=0A+test=20$(stat=20--p=3D%g=20d1)=20= =3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20= d1/f2)=20=3D=20$g1=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20= f3)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20= --p=3D%g=20d4)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d4/d5)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d4/f6)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d4/s7)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d4/s8)=20=3D=20$g1=20||=20framework_failure_=0A+#=20= check=20--exclude-directories=20excludes=20directories=20only=0A+chgrp=20= -R=20-P=20--exclude-directories=20$g2=20d4=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d1)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%g=20d1/f2)=20=3D=20$g1=20=20=20=20=20=20= =20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20f3)=20=3D=20$g1=20=20=20=20= =20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4)=20=3D=20= $g1=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g= =20d4/d5)=20=3D=20$g1=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%g=20d4/f6)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d4/s7)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d4/s8)=20=3D=20$g2=20=20=20=20=20=20=20||=20= fail=3D1=0A+#=20reset=0A+chgrp=20$g1=20d4/f6=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+chgrp=20-h=20$g1=20d4/s7=20= =20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+chgrp=20= -h=20$g1=20d4/s8=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%g=20d4/f6)=20=3D=20$g1=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%g=20d4/s7)=20=3D=20$g1=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%g=20d4/s8)=20=3D=20$g1=20||=20= framework_failure_=0A+#=20check=20--exclude-files=20excludes=20files=20= only=0A+chgrp=20-R=20-P=20--exclude-files=20$g2=20d4=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d1)=20=3D=20$g1=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%g=20d1/f2)=20=3D=20$g1=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%g=20f3)=20=3D=20$g1=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4)=20=3D=20$g2=20=20=20=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4/d5)=20=3D=20$g2=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4/f6)=20=3D=20$g1=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4/s7)=20=3D=20$g1=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4/s8)=20=3D=20$g1=20=20= =20=20||=20fail=3D1=0A+#=20reset=0A+chgrp=20$g1=20d4=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+chgrp=20= $g1=20d4/d5=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%g=20d4)=20=3D=20$g1=20=20=20= =20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20d4/d5)=20=3D=20= $g1=20||=20framework_failure_=0A+#=20check=20--exclude-directories=20and=20= --exclude-files=0A+#=20excludes=20everything=0A+chgrp=20-R=20-P=20= --exclude-directories=20--exclude-files=20$g2=20d4=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d1)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d1/f2)=20=3D=20$g1=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20f3)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d4)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d4/d5)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%g=20d4/f6)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g= =20d4/s7)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20= d4/s8)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20fail=3D1=0A+#=20cleanup=0A+rm=20-rf=20d1=20||=20= framework_failure_=0A+rm=20f3=20=20=20=20=20||=20framework_failure_=0A= +rm=20-rf=20d4=20||=20framework_failure_=0A+=0A+#=20when=20called=20on=20= a=20directory=20with=20recursion=20(-R)=0A+#=20and=20do=20follow=20= symlinks=20(-L)=0A+#=20check=20--exclude-directories=20excludes=20= directories=20only=0A+#=20and=20--exclude-files=20excludes=20files=20= only=0A+#=20and=20combined=20they=20exclude=20everything=0A+#=20and=20= symlink=20referents=20are=20affected=20but=20not=20the=20symlink=0A+#=20= and=20symlinks=20are=20traversed=0A+#=20using=20structure:=0A+#=0A+#=20=20= =20d1=0A+#=20=20=20=20=20f2=0A+#=20=20=20f3=0A+#=20=20=20d4=0A+#=20=20=20= =20=20d5=0A+#=20=20=20=20=20f6=0A+#=20=20=20=20=20s7=20->=20d1=0A+#=20=20= =20=20=20s8=20->=20f3=0A+=0A+#=20create=20structure=0A+mkdir=20d1=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+touch=20d1/f2=20=20=20=20= =20=20=20||=20framework_failure_=0A+touch=20f3=20=20=20=20=20=20=20=20=20= =20||=20framework_failure_=0A+mkdir=20d4=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+mkdir=20d4/d5=20=20=20=20=20=20=20||=20= framework_failure_=0A+touch=20d4/f6=20=20=20=20=20=20=20||=20= framework_failure_=0A+ln=20-s=20../d1=20d4/s7=20||=20framework_failure_=0A= +ln=20-s=20../f3=20d4/s8=20||=20framework_failure_=0A+#=20set=20= structure=20to=20group=20g1=0A+chgrp=20-R=20$g1=20d1=20||=20= framework_failure_=0A+chgrp=20$g1=20f3=20=20=20=20||=20= framework_failure_=0A+chgrp=20$g1=20d4=20=20=20=20||=20= framework_failure_=0A+chgrp=20$g1=20d4/d5=20||=20framework_failure_=0A= +chgrp=20$g1=20d4/f6=20||=20framework_failure_=0A+chgrp=20$g1=20d4/s7=20= ||=20framework_failure_=0A+chgrp=20$g1=20d4/s8=20||=20framework_failure_=0A= +#=20check=20groups=20set=20to=20g1=0A+test=20$(stat=20--p=3D%g=20d1)=20= =3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20= d1/f2)=20=3D=20$g1=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20= f3)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20= --p=3D%g=20d4)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d4/d5)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d4/f6)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d4/s7)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%g=20d4/s8)=20=3D=20$g1=20||=20framework_failure_=0A+#=20= check=20--exclude-directories=20excludes=20directories=20only=0A+chgrp=20= -R=20-L=20--exclude-directories=20$g2=20d4=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d1)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d1/f2)=20=3D=20$g2=20=20=20=20= =20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20f3)=20=3D=20= $g2=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%g=20d4)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4/d5)=20=3D=20$g1=20=20=20=20=20=20= =20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4/f6)=20=3D=20= $g2=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g= =20d4/s7)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d4/s8)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+#=20reset=0A+chgrp=20$g1=20d1/f2=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+chgrp=20$g1=20f3=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+chgrp=20$g1=20d4/f6=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20= d1/f2)=20=3D=20$g1=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20= f3)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20= --p=3D%g=20d4/f6)=20=3D=20$g1=20||=20framework_failure_=0A+#=20check=20= --exclude-files=20excludes=20files=20only=0A+chgrp=20-R=20-L=20= --exclude-files=20$g2=20d4=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20= d1)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%g=20d1/f2)=20=3D=20$g1=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%g=20f3)=20=3D=20$g1=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d4)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d4/d5)=20=3D=20$g2=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d4/f6)=20=3D=20$g1=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d4/s7)=20=3D=20$g1=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d4/s8)=20=3D=20$g1=20=20=20=20||=20fail=3D1=0A= +#=20reset=0A+chgrp=20$g1=20d1=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20||=20framework_failure_=0A+chgrp=20$g1=20d4=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +chgrp=20$g1=20d4/d5=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20d1)=20=3D=20$g1=20=20= =20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20d4)=20=3D=20= $g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%g=20= d4/d5)=20=3D=20$g1=20||=20framework_failure_=0A+#=20check=20= --exclude-directories=20and=20--exclude-files=0A+#=20excludes=20= everything=0A+chgrp=20-R=20-L=20--exclude-directories=20--exclude-files=20= $g2=20d4=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d1)=20=3D=20$g1=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d1/f2)=20=3D=20$g1=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20f3)=20=3D=20$g1=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4)=20=3D=20$g1=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4/d5)=20=3D=20$g1=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%g=20d4/f6)=20=3D=20$g1=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%g=20d4/s7)=20=3D=20$g1=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%g=20d4/s8)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+#=20cleanup=0A= +rm=20-rf=20d1=20||=20framework_failure_=0A+rm=20f3=20=20=20=20=20||=20= framework_failure_=0A+rm=20-rf=20d4=20||=20framework_failure_=0A+=0A= +Exit=20$fail=0Adiff=20--git=20a/tests/chmod/exclude.sh=20= b/tests/chmod/exclude.sh=0Anew=20file=20mode=20100644=0Aindex=20= 000000000..2e3c0c6b0=0A---=20/dev/null=0A+++=20b/tests/chmod/exclude.sh=0A= @@=20-0,0=20+1,297=20@@=0A+#!/bin/sh=0A+#=20Make=20sure=20GNU=20chmod=20= works=20the=20same=20way=20as=20those=20of=20Solaris,=20HPUX,=20AIX=0A+#=20= on=20directories=20with=20the=20setgid=20bit=20set.=20=20Also,=20check=20= that=20the=20GNU=20octal=0A+#=20notations=20work.=0A+=0A+#=20Copyright=20= (C)=202001-2018=20Free=20Software=20Foundation,=20Inc.=0A+=0A+#=20This=20= program=20is=20free=20software:=20you=20can=20redistribute=20it=20and/or=20= modify=0A+#=20it=20under=20the=20terms=20of=20the=20GNU=20General=20= Public=20License=20as=20published=20by=0A+#=20the=20Free=20Software=20= Foundation,=20either=20version=203=20of=20the=20License,=20or=0A+#=20(at=20= your=20option)=20any=20later=20version.=0A+=0A+#=20This=20program=20is=20= distributed=20in=20the=20hope=20that=20it=20will=20be=20useful,=0A+#=20= but=20WITHOUT=20ANY=20WARRANTY;=20without=20even=20the=20implied=20= warranty=20of=0A+#=20MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20= PARTICULAR=20PURPOSE.=20=20See=20the=0A+#=20GNU=20General=20Public=20= License=20for=20more=20details.=0A+=0A+#=20You=20should=20have=20= received=20a=20copy=20of=20the=20GNU=20General=20Public=20License=0A+#=20= along=20with=20this=20program.=20=20If=20not,=20see=20= .=0A+=0A+.=20"${srcdir=3D.}/tests/init.sh";= =20path_prepend_=20./src=0A+print_ver_=20chmod=0A+=0A= +require_membership_in_two_groups_=0A+=0A+umask=200=0A+=0A+#=20when=20= called=20on=20a=20single=20directory=0A+#=20check=20--exclude-files=20= excludes=20nothing=0A+#=20and=20--exclude-directories=20excludes=20the=20= directory=0A+=0A+#=20create=20directory=20with=20mode=20755=20and=20= check=0A+mkdir=20d=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+chmod=20755=20d=20=20=20=20=20=20=20=20=20=20=20=20= =20||=20framework_failure_=0A+chmod=20-c=20755=20d=20>=20empty=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20||=20= framework_failure_=0A+#=20change=20mode=20to=20700=20and=20check=0A= +chmod=20700=20d=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+chmod=20-c=20700=20d=20>=20empty=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20||=20= framework_failure_=0A+#=20change=20mode=20back=20to=20755=20with=20= --exclude-directories=0A+#=20and=20check=20unchanged=0A+chmod=20= --exclude-directories=20755=20d=20||=20fail=3D1=0A+chmod=20-c=20700=20d=20= >=20empty=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +compare=20/dev/null=20empty=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1= =0A+#=20change=20mode=20back=20to=20755=20with=20--exclude-directories=0A= +#=20and=20--exclude-files=20and=20check=20unchanged=0A+chmod=20= --exclude-directories=20--exclude-files=20755=20d=20||=20fail=3D1=0A= +chmod=20-c=20700=20d=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +compare=20/dev/null=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+#=20change=20mode=20= back=20to=20755=20with=20--exclude-files=0A+#=20and=20check=20changed=0A= +chmod=20--exclude-files=20755=20d=20||=20fail=3D1=0A+chmod=20-c=20755=20= d=20>=20empty=20=20=20=20=20=20||=20framework_failure_=0A+compare=20= /dev/null=20empty=20=20=20=20=20||=20fail=3D1=0A+#=20cleanup=0A+rm=20-rf=20= d=20||=20framework_failure_=0A+=0A+#=20when=20called=20on=20a=20single=20= file=0A+#=20check=20--exclude-directories=20excludes=20nothing=0A+#=20= and=20--exclude-files=20excludes=20the=20file=0A+=0A+#=20create=20file=20= with=20mode=20755=20and=20check=0A+touch=20f=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+chmod=20755=20f=20=20=20=20= =20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+chmod=20-c=20755=20= f=20>=20empty=20=20||=20framework_failure_=0A+compare=20/dev/null=20= empty=20||=20framework_failure_=0A+#=20change=20mode=20to=20700=20and=20= ckeck=0A+chmod=20700=20f=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+chmod=20-c=20700=20f=20>=20empty=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20||=20= framework_failure_=0A+#=20change=20mode=20back=20to=20755=20with=20= --exclude-files=0A+#=20and=20check=20unchanged=0A+chmod=20= --exclude-files=20755=20f=20||=20fail=3D1=0A+chmod=20-c=20700=20f=20>=20= empty=20=20=20=20=20=20||=20framework_failure_=0A+compare=20/dev/null=20= empty=20=20=20=20=20||=20fail=3D1=0A+#=20change=20mode=20back=20to=20755=20= with=20--exclude-files=0A+#=20and=20--exclude-directories=20and=20check=20= unchanged=0A+chmod=20--exclude-files=20--exclude-directories=20755=20f=20= ||=20fail=3D1=0A+chmod=20-c=20700=20f=20>=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +#=20change=20mode=20back=20to=20755=20with=20--exclude-directories=0A+#=20= and=20check=20changed=0A+chmod=20--exclude-directories=20755=20f=20||=20= fail=3D1=0A+chmod=20-c=20755=20f=20>=20empty=20=20=20=20=20=20=20=20=20=20= =20=20||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20= =20=20=20=20=20=20||=20fail=3D1=0A+#=20cleanup=0A+rm=20-f=20f=20||=20= framework_failure_=0A+=0A+#=20when=20called=20on=20a=20directory=20with=20= recursion=20(-R)=0A+#=20check=20--exclude-directories=20excludes=20= directories=20only=0A+#=20and=20--exclude-files=20excludes=20files=20= only=0A+#=20and=20combined=20they=20exclude=20everything=0A+=0A+#=20= create=20directory=20with=20a=20child=20file=0A+#=20and=20child=20= directory=20within=0A+mkdir=20d=20=20=20||=20framework_failure_=0A+touch=20= d/f=20||=20framework_failure_=0A+mkdir=20d/d=20||=20framework_failure_=0A= +#=20set=20permissions=20of=20parent=20directory=20to=20755=0A+#=20and=20= check=0A+chmod=20755=20d=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+chmod=20-c=20755=20d=20>=20empty=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20||=20= framework_failure_=0A+#=20set=20permissions=20of=20child=20file=20to=20= 755=0A+#=20and=20check=0A+chmod=20755=20d/f=20=20=20=20=20=20=20=20=20=20= =20=20||=20framework_failure_=0A+chmod=20-c=20755=20d/f=20>=20empty=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20||=20= framework_failure_=0A+#=20set=20permissions=20of=20child=20directory=20= to=20755=0A+#=20and=20check=0A+chmod=20755=20d/d=20=20=20=20=20=20=20=20=20= =20=20=20||=20framework_failure_=0A+chmod=20-c=20755=20d/d=20>=20empty=20= ||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20||=20= framework_failure_=0A+#=20recursively=20set=20all=20to=20744=20with=20= --exclude-files=0A+#=20and=20check=20file=20unchanged=0A+chmod=20-R=20= --exclude-files=20744=20d=20||=20fail=3D1=0A+chmod=20-c=20744=20d=20>=20= empty=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+compare=20= /dev/null=20empty=20=20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20= 755=20d/f=20>=20empty=20=20=20=20=20=20=20||=20framework_failure_=0A= +compare=20/dev/null=20empty=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +chmod=20-c=20744=20d/d=20>=20empty=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+#=20recursively=20set=20all=20to=20733=20with=20= --exclude-directories=0A+#=20and=20check=20directory=20unchanged=0A= +chmod=20-R=20--exclude-directories=20733=20d=20||=20fail=3D1=0A+chmod=20= -c=20744=20d=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20733=20d/f=20>=20empty=20=20= =20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+compare=20= /dev/null=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +chmod=20-c=20744=20d/d=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20fail=3D1=0A+#=20recursively=20set=20all=20to=20= 722=20with=20--exclude-files=0A+#=20and=20--exclude-directories=20and=20= check=20all=20unchanged=0A+chmod=20-R=20--exclude-files=20= --exclude-directories=20722=20d=20||=20fail=3D1=0A+chmod=20-c=20744=20d=20= >=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+compare=20= /dev/null=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20733=20d/f=20= >=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+compare=20/dev/null=20= empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20744=20d/d=20>=20empty=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20||=20fail=3D1=0A+#=20cleanup=0A+rm=20-rf=20d=20||=20= framework_failure_=0A+=0A+#=20when=20called=20on=20a=20directory=20with=20= recursion=20(-R)=0A+#=20check=20--exclude-directories=20excludes=20= directories=20only=0A+#=20and=20--exclude-files=20excludes=20files=20= only=0A+#=20and=20combined=20they=20exclude=20everything=0A+#=20and=20= symlink=20are=20ignored=0A+#=20and=20symlinks=20are=20not=20traversed=0A= +#=20using=20structure:=0A+#=0A+#=20=20=20d1=0A+#=20=20=20=20=20f2=0A+#=20= =20=20f3=0A+#=20=20=20d4=0A+#=20=20=20=20=20d5=0A+#=20=20=20=20=20f6=0A= +#=20=20=20=20=20s7=20->=20d1=0A+#=20=20=20=20=20s8=20->=20f3=0A+=0A+#=20= create=20structure=0A+mkdir=20d1=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+touch=20d1/f2=20=20=20=20=20=20=20||=20= framework_failure_=0A+touch=20f3=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+mkdir=20d4=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+mkdir=20d4/d5=20=20=20=20=20=20=20||=20= framework_failure_=0A+touch=20d4/f6=20=20=20=20=20=20=20||=20= framework_failure_=0A+ln=20-s=20../d1=20d4/s7=20||=20framework_failure_=0A= +ln=20-s=20../f3=20d4/s8=20||=20framework_failure_=0A+#=20set=20all=20to=20= 755=0A+chmod=20-R=20755=20d1=20||=20framework_failure_=0A+chmod=20755=20= f3=20=20=20=20||=20framework_failure_=0A+chmod=20-R=20755=20d4=20||=20= framework_failure_=0A+#=20check=20all=20755=0A+chmod=20-c=20755=20d1=20>=20= empty=20=20=20=20||=20framework_failure_=0A+compare=20/dev/null=20empty=20= =20=20=20||=20framework_failure_=0A+chmod=20-c=20755=20d1/f2=20>=20empty=20= ||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20||=20= framework_failure_=0A+chmod=20-c=20755=20f3=20>=20empty=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20||=20= framework_failure_=0A+chmod=20-c=20755=20d4=20>=20empty=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20||=20= framework_failure_=0A+chmod=20-c=20755=20d4/d5=20>=20empty=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20||=20= framework_failure_=0A+chmod=20-c=20755=20d4/f6=20>=20empty=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20||=20= framework_failure_=0A+#=20check=20--exclude-directories=20excludes=20= directories=20only=0A+chmod=20-R=20--exclude-directories=20744=20d4=20||=20= fail=3D1=0A+chmod=20-c=20755=20d1=20>=20empty=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20755=20= d1/f2=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20755=20f3=20>=20empty=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +compare=20/dev/null=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+chmod=20-c=20755=20d4=20>=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+compare=20/dev/null=20= empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20= -c=20755=20d4/d5=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20744=20d4/f6=20>=20= empty=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +compare=20/dev/null=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+#=20reset=0A+chmod=20755=20d4/f6=20=20=20=20=20=20=20=20= =20=20=20=20||=20framework_failure_=0A+chmod=20-c=20755=20d4/f6=20>=20= empty=20||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20= ||=20framework_failure_=0A+#=20check=20--exclude-files=20excludes=20= files=20only=0A+chmod=20-R=20--exclude-files=20744=20d4=20||=20fail=3D1=0A= +chmod=20-c=20755=20d1=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20755=20d1/f2=20= >=20empty=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +compare=20/dev/null=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+chmod=20-c=20755=20f3=20>=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+compare=20/dev/null=20= empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20= -c=20744=20d4=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20744=20d4/d5=20>=20= empty=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +compare=20/dev/null=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+chmod=20-c=20755=20d4/f6=20>=20empty=20=20=20=20=20=20=20= =20=20=20=20=20||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+#=20reset=0A= +chmod=20755=20d4=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+chmod=20755=20d4/d5=20=20=20=20=20=20=20=20=20=20=20= =20||=20framework_failure_=0A+chmod=20-c=20755=20d4=20>=20empty=20=20=20=20= ||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20||=20= framework_failure_=0A+chmod=20-c=20755=20d4/d5=20>=20empty=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20||=20= framework_failure_=0A+#=20check=20--exclude-directories=20and=20= --exclude-files=0A+#=20excludes=20everything=0A+chmod=20-R=20= --exclude-directories=20--exclude-files=20744=20d4=20||=20fail=3D1=0A= +chmod=20-c=20755=20d1=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+chmod=20-c=20755=20d1/f2=20>=20empty=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+chmod=20-c=20755=20f3=20>=20empty=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+chmod=20-c=20755=20d4=20>=20empty=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+chmod=20-c=20755=20d4/d5=20>=20empty=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+chmod=20-c=20755=20d4/f6=20>=20empty=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+#=20cleanup=0A+rm=20-rf=20d1=20||=20framework_failure_=0A+rm=20= f3=20=20=20=20=20||=20framework_failure_=0A+rm=20-rf=20d4=20||=20= framework_failure_=0A+=0A+#=20when=20called=20on=20symlink=20to=20a=20= directory=0A+#=20and=20a=20symlink=20to=20a=20file=0A+#=20check=20= --exclude-files=20excludes=20the=20target=20file=20only=0A+#=20and=20= --exclude-directories=20excludes=20the=20target=20directory=20only=0A+#=20= and=20--exclude-files=20and=20--exclude-directories=20excludes=20both=0A= +=0A+#=20creat=20directory=20and=20file=20and=20links=0A+mkdir=20d=20=20=20= =20=20=20=20||=20framework_failure_=0A+touch=20f=20=20=20=20=20=20=20||=20= framework_failure_=0A+ln=20-s=20d=20linkd=20||=20framework_failure_=0A= +ln=20-s=20f=20linkf=20||=20framework_failure_=0A+#=20set=20permissions=20= to=20755=0A+chmod=20755=20d=20||=20framework_failure_=0A+chmod=20755=20f=20= ||=20framework_failure_=0A+#=20check=20--exclude-directories=20excludes=20= directories=0A+chmod=20--exclude-directories=20744=20linkd=20||=20fail=3D1= =0A+chmod=20--exclude-directories=20744=20linkf=20||=20fail=3D1=0A+chmod=20= -c=20755=20d=20>=20empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20||=20fail=3D1=0A+chmod=20-c=20744=20f=20>=20= empty=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20fail=3D1=0A+#=20reset=0A+chmod=20755=20f=20=20=20= =20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+chmod=20-c=20= 755=20f=20>=20empty=20=20||=20framework_failure_=0A+compare=20/dev/null=20= empty=20||=20fail=3D1=0A+#=20check=20--exclude-files=20excludes=20files=0A= +chmod=20--exclude-files=20744=20linkd=20||=20fail=3D1=0A+chmod=20= --exclude-files=20744=20linkf=20||=20fail=3D1=0A+chmod=20-c=20744=20d=20= >=20empty=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +compare=20/dev/null=20empty=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +chmod=20-c=20755=20f=20>=20empty=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20||=20fail=3D1=0A+#=20reset=0A+chmod=20755=20d=20=20=20=20=20=20=20=20=20= =20=20=20=20||=20framework_failure_=0A+chmod=20-c=20755=20d=20>=20empty=20= =20||=20framework_failure_=0A+compare=20/dev/null=20empty=20||=20fail=3D1=0A= +#=20check=20--exclude-directories=20and=20--exclude-files=0A+#=20= excludes=20directories=20and=20files=0A+chmod=20--exclude-directories=20= --exclude-files=20744=20linkd=20||=20fail=3D1=0A+chmod=20= --exclude-directories=20--exclude-files=20744=20linkf=20||=20fail=3D1=0A= +chmod=20-c=20755=20d=20>=20empty=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20=20=20=20=20= =20||=20fail=3D1=0A+chmod=20-c=20755=20f=20>=20empty=20=20=20=20=20=20=20= =20=20=20||=20framework_failure_=0A+compare=20/dev/null=20empty=20=20=20=20= =20=20=20=20=20||=20fail=3D1=0A+#=20cleanup=0A+rm=20linkd=20||=20= framework_failure_=0A+rm=20linkf=20||=20framework_failure_=0A+rm=20-rf=20= d=20||=20framework_failure_=0A+rm=20f=20=20=20=20=20||=20= framework_failure_=0A+=0A+Exit=20$fail=0Adiff=20--git=20= a/tests/chown/exclude.sh=20b/tests/chown/exclude.sh=0Anew=20file=20mode=20= 100644=0Aindex=20000000000..15c06a380=0A---=20/dev/null=0A+++=20= b/tests/chown/exclude.sh=0A@@=20-0,0=20+1,307=20@@=0A+#!/bin/sh=0A+#=20= Make=20sure=20GNU=20chown=20works=20the=20same=20way=20as=20those=20of=20= Solaris,=20HPUX,=20AIX=0A+#=20on=20directories=20with=20the=20setgid=20= bit=20set.=20=20Also,=20check=20that=20the=20GNU=20octal=0A+#=20= notations=20work.=0A+=0A+#=20Copyright=20(C)=202001-2018=20Free=20= Software=20Foundation,=20Inc.=0A+=0A+#=20This=20program=20is=20free=20= software:=20you=20can=20redistribute=20it=20and/or=20modify=0A+#=20it=20= under=20the=20terms=20of=20the=20GNU=20General=20Public=20License=20as=20= published=20by=0A+#=20the=20Free=20Software=20Foundation,=20either=20= version=203=20of=20the=20License,=20or=0A+#=20(at=20your=20option)=20any=20= later=20version.=0A+=0A+#=20This=20program=20is=20distributed=20in=20the=20= hope=20that=20it=20will=20be=20useful,=0A+#=20but=20WITHOUT=20ANY=20= WARRANTY;=20without=20even=20the=20implied=20warranty=20of=0A+#=20= MERCHANTABILITY=20or=20FITNESS=20FOR=20A=20PARTICULAR=20PURPOSE.=20=20= See=20the=0A+#=20GNU=20General=20Public=20License=20for=20more=20= details.=0A+=0A+#=20You=20should=20have=20received=20a=20copy=20of=20the=20= GNU=20General=20Public=20License=0A+#=20along=20with=20this=20program.=20= =20If=20not,=20see=20.=0A+=0A+.=20= "${srcdir=3D.}/tests/init.sh";=20path_prepend_=20./src=0A+print_ver_=20= chown=0A+=0A+require_membership_in_two_groups_=0A+=0A+set=20_=20$groups;=20= shift=0A+g1=3D$1=0A+g2=3D$2=0A+=0A+#=20when=20called=20on=20a=20single=20= directory=0A+#=20check=20--exclude-files=20excludes=20nothing=0A+#=20and=20= --exclude-directories=20excludes=20the=20directory=0A+=0A+#=20create=20= directory=20with=20owner=20g1=20and=20check=0A+mkdir=20d=20||=20= framework_failure_=0A+chown=20$g1=20d=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d)=20=3D=20$g1=20||=20fail=3D1=0A+#=20change=20owner=20= to=20g2=20and=20check=0A+chown=20$g2=20d=20||=20framework_failure_=0A= +test=20$(stat=20--p=3D%u=20d)=20=3D=20$g2=20||=20fail=3D1=0A+#=20change=20= owner=20back=20to=20g1=20with=20--exclude-directories=0A+#=20and=20check=20= unchanged=0A+chown=20--exclude-directories=20$g1=20d=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d)=20=3D=20$g2=20||=20fail=3D1=0A+#=20change=20= owner=20back=20to=20g1=20with=20--exclude-files=0A+#=20and=20check=20= changed=0A+chown=20--exclude-files=20$g1=20d=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d)=20=3D=20$g1=20||=20fail=3D1=0A+#=20cleanup=0A+rm=20= -rf=20d=20=20||=20framework_failure_=0A+=0A+#=20when=20called=20on=20a=20= single=20file=0A+#=20check=20--exclude-directories=20excludes=20nothing=0A= +#=20and=20--exclude-files=20excludes=20the=20file=0A+=0A+#=20create=20= file=20with=20owner=20g1=20and=20check=0A+touch=20f=20||=20= framework_failure_=0A+chown=20$g1=20f=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20f)=20=3D=20$g1=20||=20fail=3D1=0A+#=20change=20owner=20= to=20g2=20and=20check=0A+chown=20$g2=20f=20||=20framework_failure_=0A= +test=20$(stat=20--p=3D%u=20f)=20=3D=20$g2=20||=20fail=3D1=0A+#=20change=20= owner=20back=20to=20g1=20with=20--exclude-files=0A+#=20and=20check=20= unchanged=0A+chown=20--exclude-files=20$g1=20f=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20f)=20=3D=20$g2=20||=20fail=3D1=0A+#=20change=20owner=20= back=20to=20g1=20with=20--exclude-directories=0A+#=20and=20check=20= changed=0A+chown=20--exclude-directories=20$g1=20f=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20f)=20=3D=20$g1=20||=20fail=3D1=0A+#=20= cleanup=0A+rm=20-f=20f=20||=20framework_failure_=0A+=0A+#=20when=20= called=20on=20a=20directory=20with=20recursion=20(-R)=0A+#=20check=20= --exclude-directories=20excludes=20directories=20only=0A+#=20and=20= --exclude-files=20excludes=20files=20only=0A+#=20and=20combined=20they=20= exclude=20everything=0A+=0A+#=20create=20directory=20with=20a=20child=20= file=0A+#=20and=20child=20directory=20within=0A+mkdir=20d=20||=20= framework_failure_=0A+touch=20d/f=20||=20framework_failure_=0A+mkdir=20= d/d=20||=20framework_failure_=0A+#=20set=20owner=20of=20parent=20= directory=20to=20g1=0A+#=20and=20check=0A+chown=20$g1=20d=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%u=20d)=20=3D=20$g1=20||=20= fail=3D1=0A+#=20set=20owner=20of=20child=20file=20to=20g1=0A+#=20and=20= check=0A+chown=20$g1=20d/f=20||=20framework_failure_=0A+test=20$(stat=20= --p=3D%u=20d/f)=20=3D=20$g1=20||=20fail=3D1=0A+#=20set=20owner=20of=20= child=20directory=20to=20g1=0A+#=20and=20check=0A+chown=20$g1=20d/d=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%u=20d/d)=20=3D=20$g1=20||=20= fail=3D1=0A+#=20recursively=20set=20all=20to=20g2=20with=20= --exclude-files=0A+#=20and=20check=20file=20unchanged=0A+chown=20-R=20= --exclude-files=20$g2=20d=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20= d)=20=3D=20$g2=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d/f)=20=3D=20= $g1=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d/d)=20=3D=20$g2=20||=20= fail=3D1=0A+#=20set=20child=20file=20to=20g2=20and=20check=0A+chown=20= $g2=20d/f=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20d/f)=20= =3D=20$g2=20||=20framework_failure_=0A+#=20recursively=20set=20all=20to=20= g1=20with=20--exclude-directories=0A+#=20and=20check=20directory=20= unchanged=0A+chown=20-R=20--exclude-directories=20$g1=20d=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d)=20=3D=20$g2=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d/f)=20=3D=20$g1=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%u=20d/d)=20=3D=20$g2=20||=20fail=3D1=0A+#=20set=20child=20file=20= to=20g2=20and=20check=0A+chown=20$g2=20d/f=20||=20framework_failure_=0A= +test=20$(stat=20--p=3D%u=20d/f)=20=3D=20$g2=20||=20framework_failure_=0A= +#=20recursively=20set=20all=20to=20g1=20with=20--exclude-files=0A+#=20= and=20--exclude-directories=20and=20check=20all=20unchanged=0A+chown=20= -R=20--exclude-files=20--exclude-directories=20$g1=20d=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d)=20=3D=20$g2=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d/f)=20=3D=20$g2=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%u=20d/d)=20=3D=20$g2=20||=20fail=3D1=0A+=0A+#=20when=20called=20= on=20a=20directory=20with=20recursion=20(-R)=0A+#=20and=20default=20of=20= do=20not=20follow=20symlinks=20(-P)=0A+#=20check=20--exclude-directories=20= excludes=20directories=20only=0A+#=20and=20--exclude-files=20excludes=20= files=20only=0A+#=20and=20combined=20they=20exclude=20everything=0A+#=20= and=20symlink=20referents=20are=20affected=20but=20not=20the=20symlink=0A= +#=20and=20symlinks=20are=20not=20traversed=0A+#=20using=20structure:=0A= +#=0A+#=20=20=20d1=0A+#=20=20=20=20=20f2=0A+#=20=20=20f3=0A+#=20=20=20d4=0A= +#=20=20=20=20=20d5=0A+#=20=20=20=20=20f6=0A+#=20=20=20=20=20s7=20->=20= d1=0A+#=20=20=20=20=20s8=20->=20f3=0A+=0A+#=20create=20structure=0A= +mkdir=20d1=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +touch=20d1/f2=20=20=20=20=20=20=20||=20framework_failure_=0A+touch=20f3=20= =20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+mkdir=20d4=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+mkdir=20d4/d5=20=20=20=20= =20=20=20||=20framework_failure_=0A+touch=20d4/f6=20=20=20=20=20=20=20||=20= framework_failure_=0A+ln=20-s=20../d1=20d4/s7=20||=20framework_failure_=0A= +ln=20-s=20../f3=20d4/s8=20||=20framework_failure_=0A+#=20set=20= structure=20to=20owner=20g1=0A+chown=20-R=20$g1=20d1=20||=20= framework_failure_=0A+chown=20$g1=20f3=20=20=20=20||=20= framework_failure_=0A+chown=20$g1=20d4=20=20=20=20||=20= framework_failure_=0A+chown=20$g1=20d4/d5=20||=20framework_failure_=0A= +chown=20$g1=20d4/f6=20||=20framework_failure_=0A+chown=20$g1=20d4/s7=20= ||=20framework_failure_=0A+chown=20$g1=20d4/s8=20||=20framework_failure_=0A= +#=20check=20owners=20set=20to=20g1=0A+test=20$(stat=20--p=3D%u=20d1)=20= =3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20= d1/f2)=20=3D=20$g1=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20= f3)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20= --p=3D%u=20d4)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d4/d5)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d4/f6)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d4/s7)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d4/s8)=20=3D=20$g1=20||=20framework_failure_=0A+#=20= check=20--exclude-directories=20excludes=20directories=20only=0A+chown=20= -R=20-P=20--exclude-directories=20$g2=20d4=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d1)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%u=20d1/f2)=20=3D=20$g1=20=20=20=20=20=20= =20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20f3)=20=3D=20$g1=20=20=20=20= =20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4)=20=3D=20= $g1=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u= =20d4/d5)=20=3D=20$g1=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%u=20d4/f6)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d4/s7)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d4/s8)=20=3D=20$g2=20=20=20=20=20=20=20||=20= fail=3D1=0A+#=20reset=0A+chown=20$g1=20d4/f6=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+chown=20-h=20$g1=20d4/s7=20= =20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+chown=20= -h=20$g1=20d4/s8=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%u=20d4/f6)=20=3D=20$g1=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%u=20d4/s7)=20=3D=20$g1=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%u=20d4/s8)=20=3D=20$g1=20||=20= framework_failure_=0A+#=20check=20--exclude-files=20excludes=20files=20= only=0A+chown=20-R=20-P=20--exclude-files=20$g2=20d4=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d1)=20=3D=20$g1=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%u=20d1/f2)=20=3D=20$g1=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%u=20f3)=20=3D=20$g1=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4)=20=3D=20$g2=20=20=20=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4/d5)=20=3D=20$g2=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4/f6)=20=3D=20$g1=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4/s7)=20=3D=20$g1=20=20= =20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4/s8)=20=3D=20$g1=20=20= =20=20||=20fail=3D1=0A+#=20reset=0A+chown=20$g1=20d4=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A+chown=20= $g1=20d4/d5=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+test=20$(stat=20--p=3D%u=20d4)=20=3D=20$g1=20=20=20= =20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20d4/d5)=20=3D=20= $g1=20||=20framework_failure_=0A+#=20check=20--exclude-directories=20and=20= --exclude-files=0A+#=20excludes=20everything=0A+chown=20-R=20-P=20= --exclude-directories=20--exclude-files=20$g2=20d4=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d1)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d1/f2)=20=3D=20$g1=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20f3)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d4)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d4/d5)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%u=20d4/f6)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u= =20d4/s7)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20= d4/s8)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20fail=3D1=0A+#=20cleanup=0A+rm=20-rf=20d1=20||=20= framework_failure_=0A+rm=20f3=20=20=20=20=20||=20framework_failure_=0A= +rm=20-rf=20d4=20||=20framework_failure_=0A+=0A+#=20when=20called=20on=20= a=20directory=20with=20recursion=20(-R)=0A+#=20and=20do=20follow=20= symlinks=20(-L)=0A+#=20check=20--exclude-directories=20excludes=20= directories=20only=0A+#=20and=20--exclude-files=20excludes=20files=20= only=0A+#=20and=20combined=20they=20exclude=20everything=0A+#=20and=20= symlink=20referents=20are=20affected=20but=20not=20the=20symlink=0A+#=20= and=20symlinks=20are=20traversed=0A+#=20using=20structure:=0A+#=0A+#=20=20= =20d1=0A+#=20=20=20=20=20f2=0A+#=20=20=20f3=0A+#=20=20=20d4=0A+#=20=20=20= =20=20d5=0A+#=20=20=20=20=20f6=0A+#=20=20=20=20=20s7=20->=20d1=0A+#=20=20= =20=20=20s8=20->=20f3=0A+=0A+#=20create=20structure=0A+mkdir=20d1=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+touch=20d1/f2=20=20=20=20= =20=20=20||=20framework_failure_=0A+touch=20f3=20=20=20=20=20=20=20=20=20= =20||=20framework_failure_=0A+mkdir=20d4=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+mkdir=20d4/d5=20=20=20=20=20=20=20||=20= framework_failure_=0A+touch=20d4/f6=20=20=20=20=20=20=20||=20= framework_failure_=0A+ln=20-s=20../d1=20d4/s7=20||=20framework_failure_=0A= +ln=20-s=20../f3=20d4/s8=20||=20framework_failure_=0A+#=20set=20= structure=20to=20owner=20g1=0A+chown=20-R=20$g1=20d1=20||=20= framework_failure_=0A+chown=20$g1=20f3=20=20=20=20||=20= framework_failure_=0A+chown=20$g1=20d4=20=20=20=20||=20= framework_failure_=0A+chown=20$g1=20d4/d5=20||=20framework_failure_=0A= +chown=20$g1=20d4/f6=20||=20framework_failure_=0A+chown=20$g1=20d4/s7=20= ||=20framework_failure_=0A+chown=20$g1=20d4/s8=20||=20framework_failure_=0A= +#=20check=20owner=20set=20to=20g1=0A+test=20$(stat=20--p=3D%u=20d1)=20=3D= =20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20= d1/f2)=20=3D=20$g1=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20= f3)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20= --p=3D%u=20d4)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d4/d5)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d4/f6)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d4/s7)=20=3D=20$g1=20||=20framework_failure_=0A+test=20= $(stat=20--p=3D%u=20d4/s8)=20=3D=20$g1=20||=20framework_failure_=0A+#=20= check=20--exclude-directories=20excludes=20directories=20only=0A+chown=20= -R=20-L=20--exclude-directories=20$g2=20d4=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d1)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d1/f2)=20=3D=20$g2=20=20=20=20= =20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20f3)=20=3D=20= $g2=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%u=20d4)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4/d5)=20=3D=20$g1=20=20=20=20=20=20= =20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4/f6)=20=3D=20= $g2=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u= =20d4/s7)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d4/s8)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+#=20reset=0A+chown=20$g1=20d1/f2=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20||=20framework_failure_=0A+chown=20$g1=20f3=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= framework_failure_=0A+chown=20$g1=20d4/f6=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20= d1/f2)=20=3D=20$g1=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20= f3)=20=3D=20$g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20= --p=3D%u=20d4/f6)=20=3D=20$g1=20||=20framework_failure_=0A+#=20check=20= --exclude-files=20excludes=20files=20only=0A+chown=20-R=20-L=20= --exclude-files=20$g2=20d4=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20= d1)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%u=20d1/f2)=20=3D=20$g1=20=20=20=20||=20fail=3D1=0A+test=20$(stat=20= --p=3D%u=20f3)=20=3D=20$g1=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d4)=20=3D=20$g2=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d4/d5)=20=3D=20$g2=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d4/f6)=20=3D=20$g1=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d4/s7)=20=3D=20$g1=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d4/s8)=20=3D=20$g1=20=20=20=20||=20fail=3D1=0A= +#=20reset=0A+chown=20$g1=20d1=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20||=20framework_failure_=0A+chown=20$g1=20d4=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20framework_failure_=0A= +chown=20$g1=20d4/d5=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20d1)=20=3D=20$g1=20=20= =20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20d4)=20=3D=20= $g1=20=20=20=20||=20framework_failure_=0A+test=20$(stat=20--p=3D%u=20= d4/d5)=20=3D=20$g1=20||=20framework_failure_=0A+#=20check=20= --exclude-directories=20and=20--exclude-files=0A+#=20excludes=20= everything=0A+chown=20-R=20-L=20--exclude-directories=20--exclude-files=20= $g2=20d4=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d1)=20=3D=20$g1=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d1/f2)=20=3D=20$g1=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20f3)=20=3D=20$g1=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4)=20=3D=20$g1=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ||=20fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4/d5)=20=3D=20$g1=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20= fail=3D1=0A+test=20$(stat=20--p=3D%u=20d4/f6)=20=3D=20$g1=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A= +test=20$(stat=20--p=3D%u=20d4/s7)=20=3D=20$g1=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+test=20= $(stat=20--p=3D%u=20d4/s8)=20=3D=20$g1=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20fail=3D1=0A+#=20cleanup=0A= +rm=20-rf=20d1=20||=20framework_failure_=0A+rm=20f3=20=20=20=20=20||=20= framework_failure_=0A+rm=20-rf=20d4=20||=20framework_failure_=0A+=0A= +Exit=20$fail=0A--=20=0A2.13.6=20(Apple=20Git-96)=0A=0A= --Apple-Mail=_B18FB8BC-1BE8-4D0C-B6D3-6031742A242E-- From unknown Fri Sep 12 09:56:12 2025 X-Loop: help-debbugs@gnu.org Subject: bug#30477: [PATCH] chmod chown chgrp: added --exclude-files and --exclude-directories Resent-From: Assaf Gordon Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Fri, 16 Feb 2018 22:17:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 30477 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: Ian Morris Nieves Cc: 30477@debbugs.gnu.org Received: via spool by 30477-submit@debbugs.gnu.org id=B30477.151881939030216 (code B ref 30477); Fri, 16 Feb 2018 22:17:02 +0000 Received: (at 30477) by debbugs.gnu.org; 16 Feb 2018 22:16:30 +0000 Received: from localhost ([127.0.0.1]:47311 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1emoIw-0007rH-0q for submit@debbugs.gnu.org; Fri, 16 Feb 2018 17:16:30 -0500 Received: from mail-pl0-f47.google.com ([209.85.160.47]:42444) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1emoIu-0007r4-ER for 30477@debbugs.gnu.org; Fri, 16 Feb 2018 17:16:28 -0500 Received: by mail-pl0-f47.google.com with SMTP id 31so2399878ple.9 for <30477@debbugs.gnu.org>; Fri, 16 Feb 2018 14:16:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=obeS54T4M6KR4DrXsb1H5OmPPj7G0/ZJw7GaNyUMC6Q=; b=WN0f1kLtsBGZ2RFXjLoTEMQUhdALlTEudZI0mGjvWH5NFjaQm8FOrvqjZfv6PYUxvY akDNE89jtooiAQfoNi0vaLlIxsO3Hnx8GSWiRkQJinCtpAFgiCS+ip0fp4HgifRhtcHC ZiOfLRnLbs1pXeKFev3tu6+EiGq+tM8rOKWrgecNWOGIRgHIrJTCi5B25Yhs6AvtIfUU qEkPlw1RwGWFETqJqOonpCwiycLhh2qVpFr8pevsTfRWkFvLsq3LcnatsaeDjRoKv/2A 6tRqhlb80CohTlFhShIEFPnLHjOgWyERU0DH0/r9iE61pQN6TA+OIM+OHogz4kazpcVE /9Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=obeS54T4M6KR4DrXsb1H5OmPPj7G0/ZJw7GaNyUMC6Q=; b=e1hcNR3M5pjV2d2yzyNII4yF/pZL5/Oskd+c+13KMqSEIok0zgEURgjl3Dp5xs/qP8 IiLK1V/F8OwLKOCzcEbPRd3SVt+SK2j2yu8RWGiYTDpaWuST3N4vLfI3SPiVisuTw8mb Xp3+w9zgJhy+d/6Vt6o7EZZ2t2+J0WpeNGHqCLrGAY5lmRKmC5qOW4hxDzWNVoRTs8OM QlAl9MO8MdzZ1Aq4GECdgYrlufWTVj99+Y6UigCCeE5ucrkGg6XKiogBLvTxLvcQzicn 958icpKb/k8Wy22NwX1sfHsDlglzBh9uQruKIjpQyS5/wD3mloiRqCWkqvbGcN3uitnn 84KQ== X-Gm-Message-State: APf1xPBUbFgvJF8yTqlE6c4rJiJMPq2KTgqcTdMs5+HxlFjdhQ26Q5nn ZiZrt2JYYXLrAvklyyRrSis= X-Google-Smtp-Source: AH8x227FthMaRWRcQ8y/2GHNrxO6Su5AhqAEw6tOc96ovFCT8d4KSdyFnlKsowfs9F9LZZQ+RJsZZw== X-Received: by 2002:a17:902:aa46:: with SMTP id c6-v6mr7146060plr.357.1518819382522; Fri, 16 Feb 2018 14:16:22 -0800 (PST) Received: from tomato (moose.housegordon.com. [184.68.105.38]) by smtp.gmail.com with ESMTPSA id s67sm20422282pfg.104.2018.02.16.14.16.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Feb 2018 14:16:21 -0800 (PST) Date: Fri, 16 Feb 2018 15:16:19 -0700 From: Assaf Gordon Message-ID: <20180216221619.GA25334@tomato> References: <64599A13-382F-49DF-BA99-55D61BA33EA1@alumni.cmu.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <64599A13-382F-49DF-BA99-55D61BA33EA1@alumni.cmu.edu> User-Agent: Mutt/1.5.24 (2015-08-30) X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Hello Ian, On Thu, Feb 15, 2018 at 07:44:39PM -0500, Ian Morris Nieves wrote: > Attached please find a new feature I created to simplify setting permissions (especially recursively), which enables the user to separately target files or directories. Can you provide a concrete example/scenario where this is needed, and find/xargs are not sufficient ? For example, to apply chmod/chown/chgrp on files alone (like your --exclude-directories), one can use: find $DIR -type f | xargs chmod [NEWMODE] And of course, find's predicates can be expanded to include symlinks, sockets and other conditions, and using -print0 for safer execution. regards, - assaf From unknown Fri Sep 12 09:56:12 2025 X-Loop: help-debbugs@gnu.org Subject: bug#30477: [PATCH] chmod chown chgrp: added --exclude-files and --exclude-directories Resent-From: Ian Morris Nieves Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Sat, 17 Feb 2018 03:27:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 30477 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: Assaf Gordon Cc: 30477@debbugs.gnu.org Received: via spool by 30477-submit@debbugs.gnu.org id=B30477.15188380121382 (code B ref 30477); Sat, 17 Feb 2018 03:27:02 +0000 Received: (at 30477) by debbugs.gnu.org; 17 Feb 2018 03:26:52 +0000 Received: from localhost ([127.0.0.1]:47409 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1emt9I-0000ME-5M for submit@debbugs.gnu.org; Fri, 16 Feb 2018 22:26:52 -0500 Received: from mail-qt0-f182.google.com ([209.85.216.182]:35405) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1emt9G-0000M1-Na for 30477@debbugs.gnu.org; Fri, 16 Feb 2018 22:26:51 -0500 Received: by mail-qt0-f182.google.com with SMTP id g14so6236551qti.2 for <30477@debbugs.gnu.org>; Fri, 16 Feb 2018 19:26:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alumni-cmu-edu.20150623.gappssmtp.com; s=20150623; h=mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=FXBQqpvmG+HHZ0gyZRoKMkD1DnuCcaZdWNlogJRqukw=; b=qnjF58TlmTJjtWHpCU95c4bG2BkArlrKWECC6/fFCNxaVAMCCpbLYYkF6Y1ixijuZA s2OUEUoxp6CLEPYm6HwzvGI09E2ZnLxeTRKyqmM9CWKJdaJXozboIYeJMjVcO6ZoVN7Q /D2ZBN5GG4E8Ksn5V8CUuEN1DQep6XMGegAqoy42+9wVcuOBj656grv8f2xhWd2CSqyC lFRp80uHN3U0kJv7QdzEQ+ZBcLNdcrob4SotNfL5mQ6RdPZkBJFylXyhEp6ed4tbrU8o 1KGFayQhhsWfikOQljMuW5Gm4wHusmu1Iw7hYQKfwo6PpX9j/BX7C2keIoR3OXYbMQPJ WdQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=FXBQqpvmG+HHZ0gyZRoKMkD1DnuCcaZdWNlogJRqukw=; b=Q/9Nh3HYSFKXWnJBf069y3NE0xOckt5AUVYQqroQftxU8rYY5Nush5KfbTdhfzFbcN kpCJ1IO5x2fByrZ7MGdAdrpO1nOw2dirCh0EKBdo07odFva92X2Nh4dn2Roni0owNB5B w++LveDSoWYp6Ujq0UDLrdDyxXBZGkjAy8hP5DaFCDVJ88c51XWntC9huarkQ/L8X8xH Y3XW4TOSFTfqzzGnvOkeXp1bBkb/RnsrNgNMYLtBlDmb6T0S5PX8VSaowwzIW+V+oKSg p7jo+9jMPlbkP9sUNv2kPsXs08CPRFHsIB4j2sMqvCaLXFhPUV/6o97nv6VM95wK35hM 9wAg== X-Gm-Message-State: APf1xPA1Cl/VbJ/oLliBlG5crZs+o3ZIZHIK0dvMhNriy34Yo2tzEK4e QlwPOmZsjZAN6pBz/8oOpKZYAA== X-Google-Smtp-Source: AH8x225RL8MYDiY+fTAkN6v8BHcFpARhlxJi93xZOf07DzAB3XebMKKYn+wXnaKlEb8r5GZc29jzog== X-Received: by 10.200.112.91 with SMTP id y27mr14056645qtm.260.1518838005173; Fri, 16 Feb 2018 19:26:45 -0800 (PST) Received: from ?IPv6:2601:547:1301:ee6f:986d:bef4:1208:2536? ([2601:547:1301:ee6f:986d:bef4:1208:2536]) by smtp.gmail.com with ESMTPSA id s66sm4775994qkc.37.2018.02.16.19.26.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 16 Feb 2018 19:26:44 -0800 (PST) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 11.2 \(3445.5.20\)) From: Ian Morris Nieves In-Reply-To: <20180216221619.GA25334@tomato> Date: Fri, 16 Feb 2018 22:26:43 -0500 Content-Transfer-Encoding: quoted-printable Message-Id: <792B4F40-2F62-48B1-A932-2814F9CC7535@alumni.cmu.edu> References: <64599A13-382F-49DF-BA99-55D61BA33EA1@alumni.cmu.edu> <20180216221619.GA25334@tomato> X-Mailer: Apple Mail (2.3445.5.20) X-Spam-Score: -0.7 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.7 (/) Hi Assaf, Thanks for taking the time to write this Friday. I will try to give an = explanation, and please forgive that I may be incorrect in some = reasoning. I am not actually an advanced user. I hope this is not too = much text. If you want the tl;dr summary, the next 1, 2, or 3 = paragraphs should work ;) The concrete scenario is when an entry or mid level user is trying to = set filesystem permissions. In that case, they lack strong experience = with pipe/filter concepts, as well as xargs and find (which is a beast = in itself). Googling around can show you that most users are Googling = around and copy/pasting commands to set filesystem permissions. The = commands that need to be pulled together to achieve the same outcome as = my proposed additions are beyond many. These new command line arguments = achieve similar results but at a much lower experience level.=20 The case for usability of filesystem permissions can not be understated = because this is the backbone of Linux security, and its usability should = not itself be an advanced concept if we expect Linux to be used = securely. I have seen many users resort to ugo+rwx permissions to solve = =E2=80=9Cpermission denied=E2=80=9D errors, and this is frightening. In = most cases I would surmise that the user simply needed -R = =E2=80=94exclude-files +rx And in none of these cases do the users = understand find or xargs or |, etc. beyond their understanding of = copy/paste. I do believe that usability was a goal of {chown, chmod, chgrp} because = they were given -R and users were not forced to use find $DIR | xargs = chmod [NEWMODE]. However, -R alone probably does more harm than good, = because it doesn=E2=80=99t differentiate between (at least) directories = and files. Yes advanced users may be using it properly with +X, but +X = is itself a pretty poorly understood feature, and its documentation = reads like a total hack/afterthought. My command line options help the = user be significantly more correct, and probably require little/no = cleanup afterwards. In that sense, these proposed additions increase = the ability to more properly use -R while maintaining backwards = compatibility. Here is a basic but common use case illustrated. Suppose you have a = directory/file structure: d_1 nf_1 nf_2 xf_1 d_2 =E2=80=A6 (Where d=3Ddirectory, nf=3Dnormal file, xf=3Dexecutable file) Then you could use the following commands: chmod -R =E2=80=94exclude-files ug=3Drwx,o=3Drx d_1 chmod -R =E2=80=94exclude-directories ug=3Drw,o=3D d_1 chmod ug+x d_1/xf_1 This is a straightforward pattern and what it is doing is explicit to = all. Requiring find, |, xargs, etc not only breaks the idiom, it takes = the the idiom out of the hands of all but the advanced users. On the subject of find: Yes, find is powerful, and can differentiate between symlinks, sockets, = and more. I did not add =E2=80=94exclude-symlinks because ultimately in = most cases these resolve to simply another directory or file, which the = current proposed additions address. I did not address sockets because = they are so rare they are easy to set the permissions for = non-recursively in one/few single command(s). So I have not overlooked = those in terms of my design decisions on the proposed extensions. = -print0 is not necessary (to the best of my knowledge) unless you are = using find | xargs =E2=80=A6.. Even though find exists, and can be combined with {chown, chmod, chgrp}, = it is not part of coreutils and the latter should not be overly = dependent on other commands outside coreutils for basic and intended = functionality, especially if said functionality is low hanging fruit. I = think that this line of reasoning has precedent in that fact that -R is = included in {chown, chgrp, chmod}. -R was trivial to implement (in my = opinion after having studied the sourcecode of these commands) and it = could have been left out, so all users would be required to learn find, = but that is not the case, -R was included. For the same reasons -R was = included, I hope to make a case for enabling -R to differentiate between = directories and files. In the end, yes, find is awesome. But why should {chown, chgrp, chmod} = require find to be actually useful? Note, I am not making a slippery = slope argument that would justify adding massive complexity for only a = small benefit. I am making an argument about usability to justify = adding almost 0 complexity to get a massive benefit. So I do believe I = am respecting Linux philosophy ;) If these proposed additions do not = make sense, why did -R ever make sense? Background of the situation: I spent the last 10 days dealing with file permissions bugs and flaws = found in docker dockerfiles which are used to essentially create = filesystem images. I went through lots and lots of {chmod, chown, = chgrp}, and I was shocked at how quickly find had to be used to do = something so basic as differentiate between files and directories, and = how useless -R actually was. I think that the majority of new users to = Linux are actually going to be software engineers who are using it as a = layer in a software stack and not as an OS per se. That is to say, they = are not advanced Linux users, they are entry/mid level. I say that to = make a reasonable argument that there are increasingly many smart and = talented users of Linux that are entry/mid level, and would greatly = benefit from such proposed functionality. Cheers, Ian > On Feb 16, 2018, at 5:16 PM, Assaf Gordon = wrote: >=20 > Hello Ian, >=20 > On Thu, Feb 15, 2018 at 07:44:39PM -0500, Ian Morris Nieves wrote: >> Attached please find a new feature I created to simplify setting = permissions (especially recursively), which enables the user to = separately target files or directories. >=20 > Can you provide a concrete example/scenario where this is needed, > and find/xargs are not sufficient ? >=20 > For example, to apply chmod/chown/chgrp on files alone > (like your --exclude-directories), one can use: >=20 > find $DIR -type f | xargs chmod [NEWMODE] >=20 > And of course, find's predicates can be expanded to include > symlinks, sockets and other conditions, and using -print0 for > safer execution. >=20 > regards, > - assaf From unknown Fri Sep 12 09:56:12 2025 X-Loop: help-debbugs@gnu.org Subject: bug#30477: [PATCH] chmod chown chgrp: added --exclude-files and --exclude-directories Resent-From: =?UTF-8?Q?P=C3=A1draig?= Brady Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Sat, 17 Feb 2018 21:31:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 30477 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: Ian Morris Nieves , 30477@debbugs.gnu.org Received: via spool by 30477-submit@debbugs.gnu.org id=B30477.151890303129844 (code B ref 30477); Sat, 17 Feb 2018 21:31:02 +0000 Received: (at 30477) by debbugs.gnu.org; 17 Feb 2018 21:30:31 +0000 Received: from localhost ([127.0.0.1]:48690 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1enA3y-0007lH-NM for submit@debbugs.gnu.org; Sat, 17 Feb 2018 16:30:30 -0500 Received: from mail.magicbluesmoke.com ([82.195.144.49]:59984) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1enA3w-0007l8-Fu for 30477@debbugs.gnu.org; Sat, 17 Feb 2018 16:30:28 -0500 Received: from localhost.localdomain (unknown [76.21.115.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.magicbluesmoke.com (Postfix) with ESMTPSA id B18559F85; Sat, 17 Feb 2018 21:30:26 +0000 (GMT) References: <64599A13-382F-49DF-BA99-55D61BA33EA1@alumni.cmu.edu> From: =?UTF-8?Q?P=C3=A1draig?= Brady Message-ID: <24ecaf14-b239-4d17-c1ae-66734800bfa1@draigBrady.com> Date: Sat, 17 Feb 2018 13:30:24 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <64599A13-382F-49DF-BA99-55D61BA33EA1@alumni.cmu.edu> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) On 15/02/18 16:44, Ian Morris Nieves wrote: > Hello all, > > Apologies if I have incorrectly followed any conventions. I’ve tried. > Attached please find a new feature I created to simplify setting permissions (especially recursively), which enables the user to separately target files or directories. > Tests of correctness also included. > > Any input or feedback greatly appreciated. Such functionality has been discussed previously at: https://www.gnu.org/software/coreutils/rejected_requests.html#chmod thanks, Pádraig From unknown Fri Sep 12 09:56:12 2025 X-Loop: help-debbugs@gnu.org Subject: bug#30477: [PATCH] chmod chown chgrp: added --exclude-files and --exclude-directories Resent-From: Ian Morris Nieves Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Sat, 17 Feb 2018 22:56:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 30477 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: =?UTF-8?Q?P=C3=A1draig?= Brady Cc: 30477@debbugs.gnu.org Received: via spool by 30477-submit@debbugs.gnu.org id=B30477.15189081585707 (code B ref 30477); Sat, 17 Feb 2018 22:56:01 +0000 Received: (at 30477) by debbugs.gnu.org; 17 Feb 2018 22:55:58 +0000 Received: from localhost ([127.0.0.1]:48731 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1enBOf-0001Ty-9U for submit@debbugs.gnu.org; Sat, 17 Feb 2018 17:55:58 -0500 Received: from mail-qt0-f176.google.com ([209.85.216.176]:40868) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1enBOd-0001Ti-El for 30477@debbugs.gnu.org; Sat, 17 Feb 2018 17:55:55 -0500 Received: by mail-qt0-f176.google.com with SMTP id c19so8128872qtm.7 for <30477@debbugs.gnu.org>; Sat, 17 Feb 2018 14:55:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alumni-cmu-edu.20150623.gappssmtp.com; s=20150623; h=mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=BzQzR2GcWr9TtA0KpvFm3ZQypLeeah09sRzRlHkbkTI=; b=TGr76ohlcDE8YbLwmnue1kibOr4JLq8ce23fu6OT7ZdbLkfr1QtIbUw6yx2u1Mvuro jbwRDVshI1fKaCC6k3nC9DECaJfjNJkhzG3F1948RkgbbZxD+FEe2flE2wYLg1JCkqfe 9/CS9Omvrn0IEB52rLUVDvWo7FI4vDOT0old9DXMc9xE8QW3wfSZs2Drs1ZGAU093Stx mTNTGTeWFhYGu2r3rzqMrX1TjaRUzPQ/AjOHteFPupsyNu0cUTLElNEnDAfx/+B8ggas XgKAF71m8th0n40aVJWv21iq8+QwJRXluvRtDhQZRfDnFxJVcuhWNCR1hiVPK36fxbeV t18w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=BzQzR2GcWr9TtA0KpvFm3ZQypLeeah09sRzRlHkbkTI=; b=aPlfc7XSbEwDGLKaHLPnhix0vPplyHmu6G1g1t6lGVogcqKsZJzQ99/fXicmh9Sr9C fTF3eoDPAFfx/JXE/IvKOC73/lLpDkjaYiwztxcf924Vbj2kJm9jXczt/MxsPyH0tL95 hdKbh/AeMDjyzrhv6I+3HezkDmNMlAB0ZFjlHC2XSCP8GTG/egFoe1Ektg0tH+uHoU40 7IQUtIvrcZZxWNhU1OueOifuLrA0HtPb5mhG10KbPWijKVN1oiQPziqMZHJUkXMJNtVn o4PDBvW6RzGWvG1LibX4i2MNRG1D9i/NsF/0mpAAM6pZGISV9LY0kROCJllK5FNf8DXw U1HA== X-Gm-Message-State: APf1xPBXMy7cQweEJ4UhWUAFZHlJsq+BvwP5NgiVhRIg525uZRJwa4W3 YYGZgrs1AFcVIa8VYeBOE08gQP0iP3U= X-Google-Smtp-Source: AH8x225HgXhJS18IgI+uoaGzc6HeQX+6kaFXcM8k8D2AZMmxj4XmDMl0V9zvv2KEYZ4DKrgTen3jBA== X-Received: by 10.200.38.109 with SMTP id v42mr17599287qtv.106.1518908149843; Sat, 17 Feb 2018 14:55:49 -0800 (PST) Received: from ?IPv6:2601:547:1301:ee6f:34f0:7481:2991:9fe6? ([2601:547:1301:ee6f:34f0:7481:2991:9fe6]) by smtp.gmail.com with ESMTPSA id z8sm4374803qta.83.2018.02.17.14.55.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 17 Feb 2018 14:55:49 -0800 (PST) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 11.2 \(3445.5.20\)) From: Ian Morris Nieves In-Reply-To: <24ecaf14-b239-4d17-c1ae-66734800bfa1@draigBrady.com> Date: Sat, 17 Feb 2018 17:55:48 -0500 Content-Transfer-Encoding: quoted-printable Message-Id: References: <64599A13-382F-49DF-BA99-55D61BA33EA1@alumni.cmu.edu> <24ecaf14-b239-4d17-c1ae-66734800bfa1@draigBrady.com> X-Mailer: Apple Mail (2.3445.5.20) X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) Hi P=C3=A1draig, Thanks for following along and writing. The reasoning is similar. They are missing the files only counterpart. -F and -D would be good short forms. I left those out because I = envisioned bringing similar functionality (with same invocation) to cp = and ls. Unfortunately ls already has -D and -F, and the use case for ls was not = clear to me. But if there is a good case for ls having this = functionality, then perhaps -F and -D are not ideal. Apologies, I didn=E2=80=99t know about the discussion. I was itching to = take a deep dive into Linux commands as a break from a way too deep dive = into Docker containers. Cheers, ian > On Feb 17, 2018, at 4:30 PM, P=C3=A1draig Brady = wrote: >=20 > On 15/02/18 16:44, Ian Morris Nieves wrote: >> Hello all, >>=20 >> Apologies if I have incorrectly followed any conventions. I=E2=80=99ve= tried. >> Attached please find a new feature I created to simplify setting = permissions (especially recursively), which enables the user to = separately target files or directories. >> Tests of correctness also included. >>=20 >> Any input or feedback greatly appreciated. >=20 > Such functionality has been discussed previously at: > https://www.gnu.org/software/coreutils/rejected_requests.html#chmod >=20 > thanks, > P=C3=A1draig From unknown Fri Sep 12 09:56:12 2025 X-Loop: help-debbugs@gnu.org Subject: bug#30477: [PATCH] chmod chown chgrp: added --exclude-files and --exclude-directories Resent-From: Assaf Gordon Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Thu, 25 Oct 2018 15:14:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 30477 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: 30477@debbugs.gnu.org Received: via spool by 30477-submit@debbugs.gnu.org id=B30477.154048041820719 (code B ref 30477); Thu, 25 Oct 2018 15:14:02 +0000 Received: (at 30477) by debbugs.gnu.org; 25 Oct 2018 15:13:38 +0000 Received: from localhost ([127.0.0.1]:42538 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gFhKK-0005O3-OY for submit@debbugs.gnu.org; Thu, 25 Oct 2018 11:13:38 -0400 Received: from mail-io1-f65.google.com ([209.85.166.65]:45435) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gFhKI-0005Nn-FM; Thu, 25 Oct 2018 11:13:34 -0400 Received: by mail-io1-f65.google.com with SMTP id p83-v6so5689414iod.12; Thu, 25 Oct 2018 08:13:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=iyBssYszBf3Hsylx6koDyIp48gPHg1jiJ6UU9aY7m8Q=; b=nssUQLBPKPBe2TReFaKpaIN+xqx9LAsqL2993iIA3P+ckFB5CsM86IDfMxMIh5J5gZ rK5cXDLOuyVvPMv+iefvzltEBO5ThoRdOj0gw0ItFNoBOIJnQraVO+VinWsau0HLQpji QwpZ+saAj3kKLJvl89JMWqKqLSFly4taLEoRy99GxUaSzohT7KR7l6Jt3QoVAk+nsZoA fXlBQpnoygvmTd1LodBpwwsT2tXAhtW+qfQNjOVUcRtpb37MBLxVDxwCYgZtdrfoCOBS konj0414LkH9ixSv5E7H+Oa5QtGRocaikxqjyyqPWCJ7L/dQAmZ+s2JvRkoLKHimsEAd nHcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=iyBssYszBf3Hsylx6koDyIp48gPHg1jiJ6UU9aY7m8Q=; b=aI0u+zcneOX9e4f8MezZEDNB+JMx1BY7LtmLKiVXf5547TKDKqbWEDw9uvCenFe93+ VU7CcRCiwK3pVDQudAGsKySvc3IMhai0vmLTZlEfgbGg0l0sB+nEnjxdi3aD8UO6Clmn LDUfhZainO1gE3TJ1Sn7aw2Bept+dSezpMMSGsGsu/bu28PRKqHJ2XObUy37ekzkikq9 3xUvzOz/NUSN5gVzh2lbAWJ/7ytwk2aym96QLi3PUwvzqqVjFz8kUS1IZP65vXqS+6ze TPFo/D9pWl8v1G5ssgu7+fSzppZ78/WYDJfdSHSQg2LfNeruCOUGW78ALC+iXfFdhMGl kqPw== X-Gm-Message-State: AGRZ1gIpaH2br98CEAj4Ezve2E8FGu0HeHsY/50a0cQeM/Uh0U0VmJ/1 /eg6HiBE5LlVbUBG3OfOt7exXBdC X-Google-Smtp-Source: AJdET5cymtkslBmHUcc+gwD6RZnEhD41rwRPYQm9EPpHLk0SFijFPftD2MxVbI0zwAW8Kl1R9aZuFg== X-Received: by 2002:a6b:c9d3:: with SMTP id z202-v6mr1020823iof.220.1540480408122; Thu, 25 Oct 2018 08:13:28 -0700 (PDT) Received: from tomato.housegordon.com (moose.housegordon.com. [184.68.105.38]) by smtp.gmail.com with ESMTPSA id 186-v6sm368591itf.11.2018.10.25.08.13.25 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 25 Oct 2018 08:13:26 -0700 (PDT) Date: Thu, 25 Oct 2018 09:13:22 -0600 From: Assaf Gordon Message-ID: <20181025151322.ocqxfuby7v5eteg7@tomato.housegordon.com> References: <64599A13-382F-49DF-BA99-55D61BA33EA1@alumni.cmu.edu> <24ecaf14-b239-4d17-c1ae-66734800bfa1@draigBrady.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <24ecaf14-b239-4d17-c1ae-66734800bfa1@draigBrady.com> User-Agent: NeoMutt/20170113 (1.7.2) X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) tags 30477 wontfix severity 30477 wishlist close 30477 stop (triaging old bugs) On Sat, Feb 17, 2018 at 01:30:24PM -0800, Pádraig Brady wrote: > > Such functionality has been discussed previously at: > https://www.gnu.org/software/coreutils/rejected_requests.html#chmod > Given the above, I'm closing this bug report. Discussion can continue by replying to this thread. -assaf