144

I copied a lot of read-only files from a Windows system to my Mac. When viewing the Info for each file using "Get Info", I can see they are Locked. I'm writing a bash script to copy over some files and I'm getting an error that says "Operation not permitted" So, first I need to unlock the files. Since I'll be pulling files from the Windows system often, I want my script to unlock these files.

What is the terminal command to unlock "Locked" files on OSX?

4 Answers4

206

To unlock files you can use:

chflags -R nouchg /PATH/TO/DIRECTORY/WITH/LOCKED/FILES/
  • chflags = change flags on files/folders such as "locked"
  • -R = recursive or for everything and follow directories within the specified directory
  • nouchg = means the file can be changed
  • /PATH/ = of course is the path to the files you want to change. Something like: ~/Sites/mysite/directory/with/locked/files/ works as well.
slhck
  • 228,104
Chealion
  • 25,777
  • 1
    Looks like I found the solution just as you were responding. I also learned that the -R is for recursive. So, to unlock all files in the current directory use
    chflags nochg *
    and to change just one file
    chflags nouchg onefile.txt See: http://www.mehtanirav.com/2009/04/16/recursively-unlock-files-on-mac-os-x
    – Michael Prescott Sep 14 '09 at 02:37
  • 5
    There's another relevant flag schg which is the system immutable flag (see https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/chflags.1.html) The command to clear it is similar: sudo chflags noschg PATH/TO/LOCKED/FILE – Andy Madge Jan 12 '15 at 20:22
  • 1
    Use /bin/ls -lO /path/to/file to view the macOS flags on files. Notice the full path to the macOS 'ls' command. This is needed if you have GNU Coreutils installed. – Tony Barganski Nov 07 '18 at 05:57
  • @AndyMadge - I needed to use that flag, from following directions on this page: https://www.askdavetaylor.com/how-to-delete-locked-file-on-mac-macos/. But the link you provided is dead. Do you have an updated link? – Adam_G Mar 16 '21 at 19:54
  • 1
    @Adam_G seems like Apple have moved the web page, but you can view the man page directly in MacOS terminal with the man chflags command – Andy Madge Mar 17 '21 at 12:34
  • this worked for me. Thanks – Rakshitha Muranga Rodrigo Feb 20 '22 at 10:21
25

This is helpful if you want to search an entire directory and unlock all files.

In the terminal cd to the directory

This command finds and will print a list of them.

$ find . -flags uchg

This command unlocks them.

$ find . -flags uchg -exec chflags nouchg {} \;

You can use the first command to double check that all the files are unlocked after running the second command, voilà !

Sufian
  • 129
Mamie McCall
  • 361
  • 3
  • 5
18

You can also use SetFile -a l, even though it does the same thing as chflags nouchg:

SetFile -a l file.ext

-a l unsets the bit for the locked attribute. You can install SetFile by downloading the Command Line Tools package from Xcode's preferences or from developer.apple.com/downloads.

Lri
  • 41,444
  • This is the method that worked for me on macOS Sierra with a few files copied from a Windows machine.
    I used : SetFile -a l ~/Documents/Arduino/Samples/*
    – callisto May 18 '17 at 06:59
  • As fyi, /usr/bin/SetFile (setfile) was deprecated with Xcode 6 along as were other tools supporting Carbon development; although SetFile still appears to install as part of Xcode 12 additional command line tools. See man SetFile – marc-medley May 29 '21 at 03:38
12

There are actually two lock flags that can be set on a file: uchg and schg. A file that has the uchg flag set is immutable by normal users but it is mutable by the system. A file that has the schg flag set is immutable by anyone. Both flags can be set at the same time.

To see which flags are set on a file, use

ls -lO FILE

That is a capital letter o, not zero.

To definitely unlock a file, you would have to execute

chflags nouchg,noschg FILE

as if both flags were set and you remove only one of them, it will still be locked.

Mecki
  • 1,018