How to delete X number of files in a directory
The tool you need for this is xargs
. It will convert standard input into arguments to a command that you specify. Each line of the input is treated as a single argument.
Thus, something like this would work (see the comment below, though, ls
shouldn't be parsed this way normally):
ls -U | head -40000 | xargs rm -rf
I would recommend before trying this to start with a small head
size and use xargs echo
to print out the filenames being passed so you understand what you'll be deleting.
Be aware if you have files with weird characters that this can sometimes be a problem. If you are on a modern GNU system you may also wish to use the arguments to these commands that use null characters to separate each element. Since a filename cannot contain a null character that will safely parse all possible names. I am not aware of a simple way to take the top X
items when they are zero separated.
So, for example you can use this to delete all files in a directory
find . -maxdepth 1 -print0 | xargs -0 rm -rf
How do I delete a specified number of files in a directory in Python?
You simply have to iterate correctly in the range:
files = os.listdir('path/to/your/folder')
for file in files[:11]:
os.remove(file)
in this way you are iterating through a list containing the first 11 files.
If you want to remove random files, you can use:
from random import sample
files = os.listdir('path/to/your/folder')
for file in sample(files,11):
os.remove(file)
how to delete n number of files in directory using python
Your code seems okay to me.
A few adjustments I would make:
It's better to use the
os
library so it should be cross-platform. This is because, when you writeos.remove('dogs/'+file_)
, the/
is not cross platform. Would be better to useos.remove(os.path.join('dogs', file_))
.You're wasting a lot of space holding the list of filenames to delete (Two lists of 10000 strings). If it doesn't matter to you which images to keep you could save a little bit of space (20%) by slicing:
dogs_delete=os.listdir('dogs')[2000:] # Take the last 8000 images
for file_ in dogs_delete:
os.remove(os.path.join('dogs', file_))If it does matter which images to keep, better to generate indices (less space):
dogs_dir=os.listdir('dogs')
for num in random.sample(len(dogs_dir), 8000):
os.remove(os.path.join('dogs', dogs_dir[num]))
Batch file to delete more than a specific number of files
Get a list of all files ordered from new to old.
Then loop through this list, ignoring the first three files and delete everything else.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET /a counter=1
REM get an ordered list of all files from newest to oldest
REM you may want to edit the directory and filemask
FOR /f "delims=" %%a IN (
'dir /b /a-d /tw /o-d "backups\*.*"'
) DO (
REM only if the counter is greater than 3 call the deletefile subroutine
IF !counter! GTR 3 (
CALL :deletefile %%a
) ELSE (
ECHO KEEPING FILE: %%a
)
SET /a counter=!counter!+1
)
GOTO end
:deletefile
ECHO DELETING FILE: %1
REM DEL /F /Q %1 <-- enable this to really delete the file
GOTO :EOF
:end
SETLOCAL DISABLEDELAYEDEXPANSION
ECHO Script done!
Delete Files containing specific Text in Directory and Subdirectories
DirectoryInfo dir = new DirectoryInfo(mypath);
// get all the files in the directory.
// SearchOptions.AllDirectories gets all the files in subdirectories as well
FileInfo[] files = dir.GetFiles("*.*", SearchOption.AllDirectories);
foreach (FileInfo file in files)
{
if (file.Name.Contains(myfilecontains))
{
File.Delete(file.FullName);
}
}
This is similar to hossein's answer but in his answer if the directory name contains the value of myfilecontains
that file will get deleted as well which I would think you don't want.
Keep X amount of files in folder, forfiles
@ECHO OFF
SETLOCAL
SET "targetdir=U:\destdir"
SET /a retain=10
FOR /f "skip=%retain%delims=" %%a IN (
'dir /b /a-d /o-d "%targetdir%\*" '
) DO ECHO (DEL "%targetdir%\%%a"
GOTO :EOF
You would need to change the setting of targetdir
to suit your circumstances. Equally, this procedure targets all files - change the filemask to suit.
The required DEL commands are merely ECHO
ed for testing purposes. After you've verified that the commands are correct, change ECHO(DEL
to DEL
to actually delete the files.
method is to simply execute a dir
in basic form without directories, sorted in reverse-date order.
Skip the first 10 entries, and delete the rest.
How to delete folders created older than last 7 days with C#?
This answer assumes you are measuring the date based on the name of the folder and it's parents, not the metadata of the folder(s).
Gather a list of all the possible folders to delete, and get the full paths.
string directoryPath = @"C:\folder\2022\09\19";
If you're lazy and only intend on this being ran on Windows, split by backslash.
string[] pathSegments = directoryPath.Split('\\');
The last element represents the day. The second to last represents the month, and the third to last represents the year. You can then construct your own DateTime object with that information.
DateTime pathDate = new DateTime(
year: int.Parse(pathSegments[^3]),
month: int.Parse(pathSegments[^2]),
day: int.Parse(pathSegments[^1])
);
You can now easily compare this DateTime against DateTime.Now
or any other instance.
Related Topics
Where Do Char Device Appear After Cdev_Add() Registers Successfully with Major on 117.
Register Hotkey with Only Modifiers in Linux
Azure Cli Aks Install Cli Permission Denied and Sudo Does Not Work
Skip Successfully Downloaded Files Using Wget
Perl System Calls When Running as Another User Using Sudo
Undefine Reference for Libraries, So How Could I Find The Right Path
How to Join Multiple Txt Files into Based on Column
Copy File to Backup Directory Preserving Folder Structure
How to Run My Own Script at Every Bootup
Visual Studio 2017 Could Not Create Directories, Mkdir Exit Code: 1
Write Script to Create Multiple Users with Pre-Defined Passwords
How to Include Debug Information with Nasm
How to Limit CPU and Ram Resources for Mongodump