I need a way to recursively delete a folder and its children.
Is there a prebuilt tool for this, or do I need to write one?
DEL /S doesn't delete directories.
DELTREE was removed from Windows 2000+
RMDIR or RD if you are using the classic Command Prompt (cmd.exe):
rd /s /q "path"
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.
/Q Quiet mode, do not ask if ok to remove a directory tree with /S
If you are using PowerShell you can use Remove-Item (which is aliased to del, erase, rd, ri, rm and rmdir) and takes a -Recurse argument that can be shorted to -r
rd -r "path"
admin:
takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder
Works for anything including sys files
EDIT: I actually found the best way which also solves file path too long problem as well:
mkdir \empty
robocopy /mir \empty folder
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.
/Q Quiet mode, do not ask if ok to remove a directory tree with /S
Go to the path and trigger this command.
rd /s /q "FOLDER_NAME"
/s : Removes the specified directory and all subdirectories including any files. Use /s to remove a tree.
/q : Runs rmdir in quiet mode. Deletes directories without confirmation.
/? : Displays help at the command prompt.
You can install cygwin, which has rm as well as ls etc.
For deleting a directory (whether or not it exists) use the following:
if exist myfolder ( rmdir /s/q myfolder )
rm -r -fo <path>
is the closest you can get in Windows PowerShell. It is the abbreviation of
Remove-Item -Recurse -Force -Path <path>
(more details).
The accepted answer is great, but assuming you have Node installed, you can do this much more precisely with the node library "rimraf", which allows globbing patterns. If you use this a lot (I do), just install it globally.
yarn global add rimraf
then, for instance, a pattern I use constantly:
rimraf .\**\node_modules
or for a one-liner that let's you dodge the global install, but which takes slightly longer for the the package dynamic download:
npx rimraf .\**\node_modules
via Powershell
Remove-Item -Recurse -Force "TestDirectory"
via Command Prompt
https://stackoverflow.com/a/35731786/439130
Try this command:
del /s foldername
rmdir /S /Q %DIRNAME%
rmdir /s dirname
First, let’s review what rm -rf does:
C:\Users\ohnob\things>touch stuff.txt
C:\Users\ohnob\things>rm -rf stuff.txt
C:\Users\ohnob\things>mkdir stuff.txt
C:\Users\ohnob\things>rm -rf stuff.txt
C:\Users\ohnob\things>ls -l
total 0
C:\Users\ohnob\things>rm -rf stuff.txt
There are three scenarios where rm -rf is commonly used where it is expected to return 0:
The specified path does not exist.
The specified path exists and is a directory.
The specified path exists and is a file.
I’m going to ignore the whole permissions thing, but nobody uses permissions or tries to deny themselves write access on things in Windows anyways (OK, that’s meant to be a joke…).
First set ERRORLEVEL to 0 and then delete the path only if it exists, using different commands depending on whether or not it is a directory. IF EXIST does not set ERRORLEVEL to 0 if the path does not exist, so setting the ERRORLEVEL to 0 first is necessary to properly detect success in a way that mimics normal rm -rf usage. Guarding the RD with IF EXIST is necessary because RD, unlike rm -f, will throw an error if the target does not exist.
The following script snippet assumes that DELPATH is prequoted. (This is safe when you do something like SET DELPATH=%1. Try putting ECHO %1 in a .cmd and passing it an argument with spaces in it and see what happens for yourself). After the snippet completes, you can check for failure with IF ERRORLEVEL 1.
: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%
Point is, everything is simpler when the environment just conforms to POSIX. Or if you install a minimal MSYS and just use that.
Here is what you need to do...
Create a batch file with the following line
RMDIR /S %1
Save your batch file as Remove.bat and put it in C:\windows
Create the following registry key
HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)
Launch regedit and update the default value HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default
with the following value
"c:\windows\REMOVE.bat" "%1"
Thats it! Now you can right click any directory and use the RMDIR function
LATE BUT IMPORTANT ANSWER to anyone who is having troubles installing npm packages on windows machine and if you are seeing error saying "rm -rf..." command not found.
You can use the bash cli to run rm command on windows.
for npm users, you can change the npm's config to npm config set script-shell "C:\Program Files\Git\bin\bash.exe" this way if the npm package you are trying to install has a post install script that uses rm -rf command, you will be able to run that rm command without needing to change anything in the npm package or disabling the post install scripts config. (For example, styled-components uses rm command in their post install scripts)
If you want to just use the rm command, you can easily use the bash and pass the arguments.
So yes, you can use the 'rm' command on windows.
As a sidenode:
From the linux version with all subdirs (recursive) + force delete
$ rm -rf ./path
to PowerShell
PS> rm -r -fo ./path
which has the close to same params (just seperated) (-fo is needed, since -f could match different other params)
note:
Remove-Item ALIASE
ri
rm
rmdir
del
erase
rd
in powershell, rm is alias of Remove-Item, so remove a file,
rm -R -Fo the_file
is equivalent to
Remove-Item -R -Fo the_file
if you feel comfortable with gnu rm util, you can the rm util by choco package manager on windows.
install gnu utils in powershell using choco:
choco install GnuWin
finally,
rm.exe -rf the_file
You can install GnuWin32 and use *nix commands natively on windows. I install this before I install anything else on a minty fresh copy of windows. :)
Using Powershell 5.1
get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
Replace logs with the directory name you want to delete.
get-childitem searches for the children directory with the name recursively from current path (.).
remove-item deletes the result.
USE AT YOUR OWN RISK. INFORMATION PROVIDED 'AS IS'. NOT TESTED EXTENSIVELY.
Right-click Windows icon (usually bottom left) > click "Windows PowerShell (Admin)" > use this command (with due care, you can easily delete all your files if you're not careful):
rd -r -include *.* -force somedir
Where somedir is the non-empty directory you want to remove.
Note that with external attached disks, or disks with issues, Windows sometimes behaves odd - it does not error in the delete (or any copy attempt), yet the directory is not deleted (or not copied) as instructed. (I found that in this case, at least for me, the command given by #n_y in his answer will produce errors like 'get-childitem : The file or directory is corrupted and unreadable.' as a result in PowerShell)
In powershell rm -recurse -force works quite well.
here is what worked for me:
Just try decreasing the length of the path.
i.e :: Rename all folders that lead to such a file to smallest possible names. Say one letter names. Go on renaming upwards in the folder hierarchy.
By this u effectively reduce the path length.
Now finally try deleting the file straight away.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Folder\shell\rmdir\command]
#="cmd.exe /s /c rmdir "%V""
There is also deltree if you're on an older version of windows.
You can learn more about it from here:
SS64: DELTREE - Delete all subfolders and files.
I have a new m1 laptop and I transferred all my data from my old machine onto. Including old python installations. I can't work out how to find and delete all of them so I can clean install with brew in the new version.
Brew on M1 also looks in a different directory for installs now so it can't find the old versions (inside local/bin) to uninstall them.
If brew list pythonfails, try “the brute force” method, i.e. search your entire drive for executables that are called python-×.×.
This command will not delete anything. It is up to you to manually delete the files you don’t want anymore.
find / -perm +111 -type f -or -type l 2> /dev/null | grep '/python[-0123456789\.]*$'
Explanation
find / \ # search starting at the topmost level of your drive
-perm +111 \ # executables files only
-type f -or -type l \ # only files or symlinks
2> /dev/null \ # discard errors
| grep '/python[-0123456789\.]*$' # regexp to filter names
https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html#python-package-dependencies
Above link helps to build a deployment package for AWS-Lambda. I am planning to build a package to access TensorFlow. After following the steps from AWS documentation zip file is around 110MB and directory size is 330MB.
By using the below commands package size can be reduced:
find -name "*.so" | xargs strip
find -name "*.so*" |xargs strip
find . -name \*pyc -delete
rm -R wheel*
find . -type d -name "tests" -exec rm -rf {} +
Zip package size will be reduced to 90MB and directory size is around 290MB which is still greater than the threshold mentioned by AWS.
I also tried to use the docker to build AWS-Lambda package but, Again size was more than the AWS limit.
https://medium.com/i-like-big-data-and-i-cannot-lie/how-to-create-an-aws-lambda-python-3-6-deployment-package-using-docker-d0e847207dd6
Does anyone have any suggestions/opinions where to find the correct documentation to build the package within the AWS size limit?
Don't build large dependencies into your lambda function. Use lambda layers to carry heavy dependencies. Lots of examples for this now. eg., https://github.com/antonpaquin/Tensorflow-Lambda-Layer
I'm trying to run my Kivy app in Xcode (5.1). So far, I've managed to create an Xcode project, but it gets weird in build phase, throws an error like so:
+ echo '-> Compile to pyo'
-> Compile to pyo
+ /Users/onebit0fme/kivy-ios/tmp/Python-2.7.1/hostpython -OO -m compileall /Users/onebit0fme/kivy-ios/app-MyApp/YourApp
../tools/populate-project.sh: line 32: /Users/onebit0fme/kivy-ios/tmp/Python- 2.7.1/hostpython: No such file or directory
+ echo '-> Remove unused files (pyc, py)'
-> Remove unused files (pyc, py)
+ find /Users/onebit0fme/kivy-ios/app-MyApp/YourApp -iname '*.py' -exec rm '{}' ';'
+ find /Users/onebit0fme/kivy-ios/app-MyApp/YourApp -iname '*.pyc' -exec rm '{}' ';'
+ echo '-> Source code of MyApp updated.'
-> Source code of MyApp updated.
Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure
Now, most interesting are these lines:
+ /Users/onebit0fme/kivy-ios/tmp/Python-2.7.1/hostpython -OO -m compileall /Users/onebit0fme/kivy-ios/app-MyApp/YourApp
../tools/populate-project.sh: line 32: /Users/onebit0fme/kivy-ios/tmp/Python- 2.7.1/hostpython: No such file or directory
I installed latest version of Python (2.7.6) with 'port' and set it to be default. What I don't understand are:
1. Why it tries to find Python-2.7.1 ???
2. Why it looks in 'kivy-ios/tmp/' folder (I'm sure it's not there, and never was)???
This error comes from 'kivy-ios/populate_project.sh' line 32:
echo "-> Compile to pyo"
$HOSTPYTHON -OO -m compileall $YOURAPPDIR
and I don't know where '$HOSTPYTHON' is coming from and why it gets evaluated to '/Users/onebit0fme/kivy-ios/tmp/Python-2.7.1/hostpython'.
I'm completely lost and desperate, please help who has at least a hint of what is going on.
UPDATE:
Turns out, when I did 'tools/build-all.sh', it did its job and echoed 'BUILD SUCCEEDED', but then "tar: Unrecognized archive format". As the result, there's no "build/python/lib/python27.zip" in kivy-ios folder. So, I guess, it didn't finish Kivy-ios installation, again, no idea why...
Solved. Indeed, turns out kivy-ios did not built all the packages because Python package has been moved to a new location (that's why "tar: Unrecognized archive format" appeared and I ignored it unfortunately). The solution is to change python package http in 'tools/build-python.sh'.
Here's the link to solution: https://github.com/kivy/kivy-ios/issues/85
I am trying to run statsd/graphite which uses django 1.6.
While accessing graphite URL, I get django module error
File "/opt/graphite/webapp/graphite/urls.py", line 15, in
from django.conf.urls.defaults import *
ImportError: No module named defaults
However, I do not find defaults django package inside /Library/Python/2.7/site-packages/django/conf/urls/
Please help fixing this issue.
django.conf.urls.defaults has been removed in Django 1.6. If the problem was in your own code, you would fix it by changing the import to
from django.conf.urls import patterns, url, include
However, in your case the problem is in a third party app, graphite. The issue has been fixed in graphite's master branch and version 0.9.14+.
In Django 1.8+ you can remove patterns from the import, and use a list of url()s instead.
from django.conf.urls import url, include
If for some reason you don't want to downgrade to Django 1.5.x or upgrade Graphite then you can apply the fix to your older Graphite with:
find ./ -type f -exec sed -i -e 's/from\ django\.conf\.urls\.defaults\ import\ \*/from\ django\.conf\.urls\ import\ \*/g' {} \;
..in your <graphite_dir>/webapp/graphite dir.
This helped me with my Graphite 0.9.12 and Django 1.7(.5).
(I also had to do:
find ./ -type f -exec sed -i -e 's/mimetype\=/content_type\=/g' {} \;
find ./ -type f -exec sed -i -e 's/content_type\=mimetype/content_type\=content_type/g' {} \;
..later on as after I managed to start Graphite some of its features didn't work. Now they work for me but YMMV.)
go to the file location where you have installed python.
open cmd on that path and then install django with command >> pip install django
Then cross check on python shell with import django(which should do nothing)
or simply use the command >> python -m django --version
it will simply give you version
enter image description here
enter image description here