Swiss File Knife is a supercharged command line tool which crams around 100 functions into a single executable.
The program can search for files by content, or name. It's able to list the contents of directories, create or delete directory trees. And you get a lengthy list of text and file processing options: LF <> CRLF, tab <> space, hex <> binary, hex <> dec, insert string, replace string, sort string, split file, join file, more.
This would be useful in itself, but Swiss File Knife does a whole lot more. The program also includes commands to synchronise a folder tree, find duplicate files, cut video and binary files, create MD5 hashes, send UDP or HTTP requests, download HTTP files, even run instant FTP and HTTP servers.
Most of these commands deliver far more than you'd expect. The List command doesn't just list files in a directory tree, for example: it also supports a host of archive formats. And it's enormously flexible, with more than 35 switches, which can themselves be combined in many different ways, and have their output passed on to other Swiss File Knife commands.
There's also plenty of scripting support, with tools to get user input, run sequences of Swiss File Knife commands, run commands on every file in a folder, run commands in a loop, and more.
Perhaps most surprising of all, though, Swiss File Knife isn't too difficult to learn. There's a lot to explore, but the syntax of each command is relatively straightforward. When listing files, for example, there's no "-n -l -p" garbage: instead you'll use switches like -time, -hidden, -sort, -minsize, -maxsize and so on. You can probably guess what they do already. And if you can't, a truly excellent PowerShell-like local Help system explains all.
chg: Syntax Change: sfk zip: no longer adds .zip to output filename if it contains any dot '.'. this allows to create zip files with any extension, like .odt or .jar. use option -zipext for the old behaviour.
- add: checkzip: option -md5 to show md5 checksums of zip file contents
- add: general option -more to pause output per page.
- add: xhexfind: option -context=n to show n bytes of context around results.
- add: sfk for: now supports counting down, negative start/end values, and optional step size.
- add: sfk zip: option -rel to strip top level folder name of filenames within zip.
- add: sfk xed: option -write to rewrite a given file with changed output.
- fix: sfk if: now supports expression starting with plus like: if "+a = +a" ...
- fix: perline: context and options were not fully reset between two lines, e.g. load files.txt +perline "list #qtext" -yes produced wrong output.
- add: sfk move: move files between two folders.
- add: sfk mkdir: option -forfile to create dir tree for a given filename
- add: scripts: #(substr(s,o,l)) now also supports variable (names) for o and l.
- add: scripts: #(rsubstr(s,o,l)) to get substring from the right side in left direction.
- add: sfk getcol, tabcol to get one column from whitespace or tab separated text. alias of sfk filter.
- add: sfk ping: option -every to ping every n sec.
- add: make-random-file: output folder creation.
- add: sfk times, alias for sfk list -times.
- add: list: now also accepts -times with 's'.
- add: sfk getvar: option -numline=n to get a line by number.
- add: zip/unzip: option -offtime to support file times which are one hour off.
- fix: xtext: with -to out\$file it produced error -4 during simulation.
- fix: xtext: -to out\$file no longer writes :file headers into output files.
- fix: rand: missing range check.
- fix: ifexist file stop -all ... was not possible.
- fix: windows mingw g++ compile.
- chg: sfk if: improved "need a command" error info.
- doc: list: example how to keep only existing filenames from a list of filenames
- doc: count: example for filter/setvar/count.
- doc: copy: reference to move.
- doc: xtext: how to extract text starting at a line.
- doc: help var: new (r)substr behaviour.
- doc: addcr: example for current folder.
- doc: sfk times example.
- doc: sfk zip: example to unzip/zip an .odt file.