====== Removing Unused Files ======
When a new DokuWiki version is released, some of the files that were needed previously may become obsolete.
Keeping the files may cause the following issues:
* Misleading error messages related to outdated plugins.
* They pose a security risk.
* They could break later installations.
So we recommend to delete them.
A list of all files that were removed in recent releases can be found in ''data/deleted.files''. You should check if they still exist in your install. If they do, delete them.
You can also see the current list at https://github.com/dokuwiki/dokuwiki/raw/stable/data/deleted.files
:!: Important: The list of files is case-sensitive. On case-insensitive file systems((Case-insensitive file systems are, under some circumstances: Windows and macOS)) the scripts below may delete too much!
===== Using a Plugin =====
When upgrading your wiki using the [[plugin:upgrade|upgrade Plugin]], the plugin will take care of removing the deleted files automatically for you.
Alternatively the [[plugin:removeold|removeold Plugin]] can be used.
===== Using a Script =====
People with shell access to their server can use a script to automatically delete all old files.
==== Linux Shell ====
This simple line should work on any Linux system
grep -Ev '^($|#)' data/deleted.files | xargs -n 1 rm -vf
==== *nix Shell ====
Some systems may not support the "rm -d" option for directory removal. In that case, you have to use recursive removal (just be sure to double-check that the file list does not include any paths that will delete too much):
grep -Ev '^($|#)' data/deleted.files | xargs -n 1 rm -fr
==== Python Script ====
Here's a Python script that will also print the files deleted
import os
for line in open("./data/deleted.files"):
if line.isspace() or line[0] == '#':
continue
line = line.rstrip(os.linesep)
try:
if os.path.exists(line):
print('File removed => ' + line)
os.remove(line)
except OSError:
pass
Here's an alternative Python script that is case sensitive and will also delete directories included in the list
import os
import shutil
def exists_casesensitive(path):
if not os.path.exists(path):
return False
directory, filename = os.path.split(path)
return filename in os.listdir(directory)
with open("./data/deleted.files") as file:
for line in file:
line = line.strip()
if line and not line.startswith('#'):
path = line.rstrip(os.linesep)
if exists_casesensitive(path):
if os.path.isdir(path):
shutil.rmtree(path)
print('Directory removed => ' + path)
else:
os.remove(path)
print('File removed => ' + path)
else:
#print('File not found => ' + path)
pass
==== Ruby Script ====
Here's a Ruby script doing the same
files = File.read("./data/deleted.files").split("\n").grep(/^[^$#]/)
files.each do |file|
puts "Deleting #{file}."
File.delete(file) rescue puts $!
end
==== PHP Script ====
The same for PHP:
';
}
}
echo 'Done!';
}
==== Powershell Script ====
Here's a one-line powershell script doing the same
Get-Content .\data\deleted.files | Where-Object {$_ -notmatch '^($|#)' -and (Test-Path $_ )} | Foreach-Object {Remove-Item -path $_ -Force -Recurse}
==== CMD Script ====
Here's a one-line Windows's CMD script doing the same, although you may need to first reverse all the slashes in 'deleted.files' for the filenames to be accepted.
for /F %i in ('findstr /R /V /C:"^#" /C:"^$" data\deleted.files') do del "%i"