ChatGPT解决这个技术问题 Extra ChatGPT

Change all files and folders permissions of a directory to 644/755

How would I change all files to 644 and all folders to 755 using chmod from the linux command prompt? (Terminal)

If someone (@animuson) would be so kind to explain me, why this chmod question is off-topic and all others (14,438 results) here aren't...
Little late, but this one command will also do the accepted answer in one shot: chmod -R a=r,a+X,u+w /your/path
Good question, doesn't deserve closing. These should rather be moved to a stackoverflow sub site than closed.
@hugoderhungrige it means go ask it on a Server site like: http://superuser.com :P but this question helped me here, thanks.

T
T.Todua

One approach could be using find:

for directories

find /desired_location -type d -print0 | xargs -0 chmod 0755

for files

find /desired_location -type f -print0 | xargs -0 chmod 0644

just for someone else like me, this doesn't work instead try sudo find /your/location -type f -exec chmod 644 {} \; for files and sudo find /your/location -type d -exec chmod 755 {} \; for directories
I ran the original solution and it messed up my permissions on files and directories. watch out! the solution on the comment worked, thanks!
Why (?) it is better tham chmod -R a=r,u+w,a+X /foo?
fails with unable to execute /bin/chmod: Argument list too long
What if I want only the subfolder to be chmod 755 when specifying the desired_location ? Because this also will make the parent folder 755
T
T.Todua

The easiest way is to do:

chmod -R u+rwX,go+rX,go-w /path/to/dir

which basically means:

to change file modes -Recursively by giving:

user: read, write and eXecute permissions,

group and other users: read and eXecute permissions, but not -write permission.

Please note that X will make a directory executable, but not a file, unless it's already searchable/executable.

+X - make a directory or file searchable/executable by everyone if it is already searchable/executable by anyone.

Please check man chmod for more details.

See also: How to chmod all directories except files (recursively)? at SU


chmod -R a=r,u+w,a+X /foo
This answer, while neat, does have a problem: a file that is executable before running the command will be executable afterwards. See the answer of @JohnAllsup for a command that does not have this flaw.
@mzuther unless this problem is actually feature for you
J
John Allsup

The shortest one I could come up with is:

chmod -R a=r,u+w,a+X /foo

which works on GNU/Linux, and I believe on Posix in general (from my reading of: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/chmod.html).

What this does is:

Set file/directory to r__r__r__ (0444) Add w for owner, to get rw_r__r__ (0644) Set execute for all if a directory (0755 for dir, 0644 for file).

Importantly, the step 1 permission clears all execute bits, so step 3 only adds back execute bits for directories (never files). In addition, all three steps happen before a directory is recursed into (so this is not equivalent to e.g.

chmod -R a=r /foo
chmod -R u+w /foo
chmod -R a+X /foo

since the a=r removes x from directories, so then chmod can't recurse into them.)


brilliant! helped me a lot
C
Christian Michael

On https://help.directadmin.com/item.php?id=589 they write:

If you need a quick way to reset your public_html data to 755 for directories and 644 for files, then you can use something like this:

cd /home/user/domains/domain.com/public_html
find . -type d -exec chmod 0755 {} \;
find . -type f -exec chmod 0644 {} \;

I tested and ... it works!


Life saver! Thanks for the clean solution to this issue! Worked for me when needing to fix permissions issues for a WordPress install!
Works well to make the adjustments within a directory.
M
Mark D

Easiest for me to remember is two operations:

chmod -R 644 dirName
chmod -R +X dirName

The +X only affects directories.


Simplest and safer
J
Jair Reina

This worked for me:

find /A -type d -exec chmod 0755 {} \;
find /A -type f -exec chmod 0644 {} \;

Be careful: These commands won't handle files or directories with spaces in their names. The commands in the accepted answer will.
This caveat only applies, if {} isn't surrounded by quotes … thus, there's no reason to play around with print0 and xargs -0, the following suffices: find /A -type X -exec chmod Y '{}' \;
m
mza

Do both in a single pass with:

find -type f ... -o -type d ...

As in, find type f OR type d, and do the first ... for files and the second ... for dirs. Specifically:

find -type f -exec chmod --changes 644 {} + -o -type d -exec chmod --changes 755 {} +

Leave off the --changes if you want it to work silently.


I
IAmInPLS

This can work too:

chmod -R 755 *  // All files and folders to 755.

chmod -R 644 *.*  // All files will be 644.

DONT ANYONE DO THAT! it affects complete server!