How to do things
AI Noob vs. Pro

List biggest files
List newest files
Show subdir sizes
Search in files
Replace word in files
List dir differences
Send files in LAN

Free Open Source:

Swiss File Knife

a command line
multi function tool.

remove tabs
list dir sizes
find text
filter lines
find in path
collect text
instant ftp or
http server
file transfer
send text
patch text
patch binary
run own cmd
convert crlf
dup file find
md5 lists
fromto clip
hexdump
split files
list latest
compare dirs
save typing
trace http
echo colors
head & tail
dep. listing
find classes
speed shell
zip search
zip dir list

Depeche View
Source Research
First Steps

windows GUI
automation

command line
file encryption

free external tools,
zero install effort,
usb stick compliant:

zip and unzip
diff and merge
reformat xml
reformat source

cpp sources

log tracing
mem tracing
hexdump
using printf

articles

embedded
stat. c array
stat. java array
var. c array
var. java array
view all text
as you type
surf over text
find by click
quick copy
multi view
find nearby
fullscreen
bookmarks
find by path
expressions
location jump
skip accents
clip match
filter lines
edit text
highlight
load filter
hotkey list
receive text
send in C++
send in Java
smooth scroll
touch scroll
fly wxWidgets
fly over Qt
search Java

Supersonic Text File Search - Free Download

run a self-defined command on many files in a directory tree on the Windows, Mac OS X, Linux and Raspberry Pi command line with a free open source tool.
  • Download the free Swiss File Knife Base from Sourceforge.
  • Open the Windows CMD command line, Mac OS X Terminal or Linux shell.
  • OS X : type mv sfk-mac-64.exe sfk and chmod +x sfk then ./sfk
  • Linux: type mv sfk-linux-64.exe sfk and chmod +x sfk then ./sfk. OS X and Linux syntax may differ, check the help within the tool.
sfk run "your command $file [$relfile] [...]" [-yes] [-nohead] [-quiet] [...]

run a self-defined command on every file- or directory name.
within your command string, you may specify:

   $file                     - insert full filename, including path.
   $quotfile    or $qfile    - just as $file, but with quotes "" around.
   $relfile     or $qrelfile - insert relative filename, without path.
   $base        or $qbase    - the relative base filename, without extension.
   $ext         or $qext     - filename extension. foo.bar.txt has extension .txt.
   $path        or $qpath    - the path (directory) without filename.
   $relpath     or $qrelpath - sub path relative to start folder.
   $ufile       or $upath    - force unix style slashes "/" on output.
   $qufile      or $qupath   - unix slashes and quotes combined.
   $since       or $qsince   - with option -sincediff: the reference file name.
   $text        or $qtext    - one record of input text, similar to $file.
   $targ        or $qtarg    - with -tomake: target filename.

   always prefer 'q' forms over non-quoted forms: as soon as there is a filename
   containing blanks, e.g. X:\the src files\test one.txt, you will need quotations,
   or you have to manually insert \" or \q escaped quotes (see 3rd example below).
   you may also use $quotrelfile, $quotsince, $quottext for greater clarity.
   if you supply only $path expressions, only directories will be processed.
   on single word chain commands like "+run vi", " $qfile" is added automatically.

further pattern support:
   -spat       activates slash patterns like \t \q \xnn etc.
   -upat       unix style syntax using # instead of $

options
   -yes        really execute. default is just to simulate what would be done.
               you may also type run. (with a dot) as quick confirmation.
   -nohead     does not display the [simulating:] info text.
   -noinfo     unless you use $text, sfk checks the input filenames
               1. if they contain blanks, but no quotes are given within command.
               2. if they seem to use the wrong path separator character.
               in both cases, a reminder is printed. if you know that your command
               needs no changes, add -noinfo or use $text instead of $file.
   -quiet      does not echo the commands before execution.
   -relnames   strips the root directory names from filenames.
   -i[files]   process a text or filename list from stdin.
   -idirs      process a directory name list from stdin.
               on stdin, '#' remark lines and empty lines are skipped. note:
               "sfk.exe <list.txt" supports only 4 KB for list.txt under windows.
               "type list.txt | sfk.exe" supports unlimited stream length.
   -nofile[names]   with chaining, does not create ":file " name records.
   -printcmd   print the full command which is executed to console.
   -stoprc=n   stop processing if a command returns return code >= n.

command string format
   with option -spat, slashpatterns like \t \q \xnn are supported.
   due to syntax limitations of the command shell, it may help
   - to use \q instead of \"   (avoids quote miscounting at shell)
   - to use \x26 instead of &  (if ampersand is behaving unexpected)

quoted variable expansion
   when using sfk variables which contain filenames, like in
      run "copy #(src) #(dst)"
   then spaces in filenames require enquoting. when using -spat
   and \q it may cause conflicts if the filename itself contains
   known slash patterns, like \t in file 'mydir\thebar.txt'.
   to avoid this you can use (with sfk run only):
      run "copy #(qsrc) #(qdst)"
   which will surround variable contents by double quotes.

quoted multi line parameters are supported in scripts
   using parm trim. type "sfk script" for details.

temporary or permanent output files
   if run output is post-processed by command chaining, e.g. run ... +filter,
   sfk creates temporary files to collect the output. by default, these files
   are deleted when run finishes. say "sfk help options" for more on this.
   specify -to targetdir\$file to write command output into a permanent
   target fileset. required directories are created automatically.
   -to accepts the same mask as run itself, e.g. -to "mydir\$path\$base.tmp"
   by default, standard output AND standard error stream are written to file.
   add 2>nul to your command to strip the error stream.

return code by variable
   sfk variable run.lastrc contains the return code of the external
   program called. if multiple files were processed then it contains
   only the rc of the last file.

command chaining notes
   sfk run "...$path..." +nextcmd: will pass directories, not filenames.
   sfk run ... -to tmp\$file +nextcmd: will pass output filenames, not input.
   sfk run ... +run: will pass unchanged input filename list.

see also
   sfk perline  run sfk command(s) per text input line.
   sfk runloop  run commands using a loop counter.

web reference
   http://stahlworks.com/sfk-run

examples
   sfk run "attrib -R $qfile" -quiet testfiles\FooBank\BarDriver
      removes readonly attribute on all files within BarDriver
   sfk run "<img src=$quottext>" -dir . -file .jpg -nohead >index.html
      create html-style image list of all jpegs (using just simulation).
      note that option -nohead removes the [simulating:] info text lines.
   type dirlist.txt | sfk run -idirs "xcopy \"x:\$path\" \"z:\$path\" /I /D"
      update-copy all directories from dirlist.txt from x: to z:
   sfk run "diff oldsrc\$file newsrc\$file" -relnames -sincediff oldsrc newsrc
      compare directories, run "diff" on all files with different content.
   sfk run "diff $qsince $qfile" -sincediff oldsrc newsrc
      same as above, only shorter and safer (including quotes around filenames).
   sfk run "zip update.zip $qfile" -since 20070131 . .java .jsp
      collect .java and .jsp files added/changed since 31-Jan-2007 into a zip file.
   sfk list testfiles .txt +run vi
      open all .txt files in vi. $qfile is added automatically.
   sfk sel . .avi +run "ffmpeg -i $file -f image -t .02 thumbs\$base-%d.jpg"
      extract first image from all .avi movies, videos using ffmpeg.
   sfk sel -since 30m . .cpp .hpp +run -printcmd "rm $path/$base.o"
      delete all object files of source codes changed in the last 30 minutes
   sfk echo -lines 100 101 102 +run "showstatus.bat $text"
      run showstatus.bat three times with the given numbers, e.g. local ip's.
   sfk sel soundlib .wav -tomake "outdir\$base.mp3"
    +run "ffmpeg -i $qfile $qtarg"
      for all .wav files within soundlib that have no, or an older, .mp3 file
      within outdir, run command ffmpeg to convert from .wav to .mp3.
   sfk -exectime run. "copy in.dat out.dat"
      measure the time it takes to run a copy command.
   sfk -var run "myprog.exe" -yes +tell "myprog rc: #(run.lastrc)"
      run external program myprog.exe and tell it's return code.

Don't try to execute a full run statement in ONE GO. Almost certainly, something
will go wrong (wrong files selected, syntax error in the command itself), and you
end up with many wrong output files. Instead, use THREE STEPS:

1. find the correct file set, by some trial and error:
      sfk run "echo $quotfile" mydir
   This will simply show all filenames from "mydir". no command is executed
   on those files, so nothing bad is happening. almost certainly, you notice
   that too many files are included. Maybe you have to add "-nosub" to exclude
   subfolders, or add more details about your file selection, like:
      sfk run "echo $quotfile" mydir .jpg .jpeg
   which reduces the file set to just .jpg and .jpeg files within "mydir".

2. Replace "echo" by the actual command, still running in simulation mode.
      sfk run "copy $quotfile \"d:\pic\small_$base.jpg\"" mydir .jpg .jpeg
   This simulates a copy of all images from mydir to d:\pic, prefixing their name
   by "small_", and ensuring that all target file extensions are only ".jpg".

3. When you're satisfied with the simulation output, add "-yes".

 
 Another example: list the methods of all .class files in a directory tree.

    This time, we take a different approach, starting with "sfk list".
    To list all .class files in the directory tree "pack", we say:
       sfk list pack .class

    This may result in an output like this:
       pack\Lemon.class
       pack\Curry.class
       pack\Yet.class
       pack\Another.class
       pack\One.class
    
    Our goal is to turn these lines into commands of the form:
       javap pack.classname

    So how do we achieve this? First, we have to change the format of the
    output lines, through adding a "filter" command:
       sfk list pack .class +filter -rep /\/./ -rep /.class//

    This replaces all slashes "\" by a dot ".", and strips off the ".class".
    Now the resulting output is:
       pack.Lemon
       pack.Curry
       pack.Yet
       pack.Another
       pack.One
    
    Finally, we pipe this into "run":

    sfk list pack .class +filt -rep /\/./ -rep /.class// +run "javap $file"

    The resulting output - a simulated preview - is now:
       javap "pack.Lemon"
       javap "pack.Curry"
       javap "pack.Yet"
       javap "pack.Another"
       javap "pack.One"
    
 Finally, run the command again, this time adding "-yes":

 sfk list pack .class +filt -rep /\/./ -rep /.class// +run "javap $file" -yes

 Which will result in the interface listings of all classes.
sfk run "your command $file [$relfile] 
   [...]" [-yes] [-nohead] [-quiet] [...]

run a self-defined command on every file- 
or directory name. within your command
string, you may specif
y:

   $file                     - insert 
                       full filename,
                       including path.
   $quotfile    or $qfile    - just as 
                $file, but with quotes ""
                around.
   $relfile     or $qrelfile - insert 
                relative filename, without
                path.
   $base        or $qbase    - the 
                relative base filename,
                without extension.
   $ext         or $qext     - filename 
                extension. foo.bar.txt has
                extension .txt.
   $path        or $qpath    - the path 
                (directory) without
                filename.
   $relpath     or $qrelpath - sub path 
                relative to start folder.
   $ufile       or $upath    - force 
                unix style slashes "/" on
                output.
   $qufile      or $qupath   - unix 
                slashes and quotes combined.
                
   $since       or $qsince   - with 
                option -sincediff: the
                reference file name.
   $text        or $qtext    - one 
                record of input text,
                similar to $file.
   $targ        or $qtarg    - with 
                -tomake: target filename.

   always prefer 'q' forms over non-quoted 
   forms: as soon as there is a filename
   containing blanks, e.g. X:\the src files\
   test one.txt, you will need quotations,
   or you have to manually insert \" or \q
   escaped quotes (see 3rd example below).
   you may also use $quotrelfile,
   $quotsince, $quottext for greater
   clarity. if you supply only $path
   expressions, only directories will be
   processed. on single word chain commands
   like "+run vi", " $qfile" is added
   automatically.

further pattern support:
   -spat       activates slash patterns 
               like \t \q \xnn etc.
   -upat       unix style syntax using # 
               instead of $

options
   -yes        really execute. default is 
               just to simulate what would
               be done. you may also type
               run. (with a dot) as quick
               confirmation.
   -nohead     does not display the 
               [simulating:] info text.
   -noinfo     unless you use $text, sfk 
               checks the input filenames 1.
               if they contain blanks, but
               no quotes are given within
               command. 2. if they seem to
               use the wrong path separator
               character. in both cases, a
               reminder is printed. if you
               know that your command needs
               no changes, add -noinfo or
               use $text instead of $file.
   -quiet      does not echo the commands 
               before execution.
   -relnames   strips the root directory 
               names from filenames.
   -i[files]   process a text or filename 
               list from stdin.
   -idirs      process a directory name 
               list from stdin. on stdin,
               '#' remark lines and empty
               lines are skipped. note:
               "sfk.exe <list.txt"
               supports only 4 KB for list.
               txt under windows. "type
               list.txt | sfk.exe" supports
               unlimited stream length.
   -nofile[names]   with chaining, does not 
                    create ":file " name
                    records.
   -printcmd   print the full command which 
               is executed to console.
   -stoprc=n   stop processing if a command 
               returns return code >= n.

command string format
   with option -spat, slashpatterns like \t 
                \q \xnn are supported.
   due to syntax limitations of the command 
   shell, it may help - to use \q instead
   of \" (avoids quote miscounting at
   shell) - to use \x26 instead of &
   (if ampersand is behaving unexpected)

quoted variable expansion
   when using sfk variables which contain 
   filenames, like in
      run "copy #(src) #(dst)"
   then spaces in filenames require 
   enquoting. when using -spat and \q it
   may cause conflicts if the filename
   itself contains known slash patterns,
   like \t in file 'mydir\thebar.txt'. to
   avoid this you can use (with sfk run
   only):
      run "copy #(qsrc) #(qdst)"
   which will surround variable contents by 
   double quotes.

quoted multi line parameters are supported 
in scripts
   using parm trim. type "sfk script" for 
   details.

temporary or permanent output files
   if run output is post-processed by 
   command chaining, e.g. run ... +filter,
   sfk creates temporary files to collect
   the output. by default, these files are
   deleted when run finishes. say "sfk help
   options" for more on this. specify -to
   targetdir\$file to write command output
   into a permanent target fileset.
   required directories are created
   automatically. -to accepts the same mask
   as run itself, e.g. -to "mydir\$path\
   $base.tmp" by default, standard output
   AND standard error stream are written to
   file. add 2>nul to your command to
   strip the error stream.

return code by variable
   sfk variable run.lastrc contains the 
 return code of the external
   program called. if multiple files were 
   processed then it contains only the rc
   of the last file.

command chaining notes
   sfk run "...$path..." +nextcmd: will 
   pass directories, not filenames. sfk run
   ... -to tmp\$file +nextcmd: will pass
   output filenames, not input. sfk run ...
   +run: will pass unchanged input filename
   list.

see also
   sfk perline  run sfk command(s) per 
                text input line.
   sfk runloop  run commands using a loop 
                counter.

web reference
   http://stahlworks.com/sfk-run

examples
   sfk run "attrib -R $qfile" -quiet 
                     testfiles\FooBank\
                     BarDriver
      removes readonly attribute on all 
      files within BarDriver
   sfk run "<img src=$quottext>" 
   -dir . -file .jpg -nohead >index.
   html
      create html-style image list of all 
      jpegs (using just simulation). note
      that option -nohead removes the
      [simulating:] info text lines.
   type dirlist.txt | sfk run -idirs 
   "xcopy \"x:\$path\" \"z:\$path\" /I /D"
      update-copy all directories from 
      dirlist.txt from x: to z:
   sfk run "diff oldsrc\$file newsrc\
   $file" -relnames -sincediff oldsrc
   newsrc
      compare directories, run "diff" on 
      all files with different content.
   sfk run "diff $qsince $qfile" 
   -sincediff oldsrc newsrc
      same as above, only shorter and safer 
      (including quotes around filenames).
   sfk run "zip update.zip $qfile" -since 
   20070131 . .java .jsp
      collect .java and .jsp files 
      added/changed since 31-Jan-2007 into
      a zip file.
   sfk list testfiles .txt +run vi
      open all .txt files in vi. $qfile is 
      added automatically.
   sfk sel . .avi +run "ffmpeg -i $file -f 
                    image -t .02 thumbs\
                    $base-%d.jpg"
      extract first image from all .avi 
      movies, videos using ffmpeg.
   sfk sel -since 30m . .cpp .hpp +run 
             -printcmd "rm $path/$base.o"
      delete all object files of source 
      codes changed in the last 30 minutes
   sfk echo -lines 100 101 102 +run 
              "showstatus.bat $text"
      run showstatus.bat three times with 
      the given numbers, e.g. local ip's.
   sfk sel soundlib .wav -tomake "outdir\
                           $base.mp3"
    +run "ffmpeg -i $qfile $qtarg"
      for all .wav files within soundlib 
      that have no, or an older, .mp3 file
      within outdir, run command ffmpeg to
      convert from .wav to .mp3.
   sfk -exectime run. "copy in.dat 
         out.dat"
      measure the time it takes to run a 
      copy command.
   sfk -var run "myprog.exe" -yes +tell 
         "myprog rc: #(run.lastrc)"
      run external program myprog.exe and 
      tell it's return code.

Don't try to execute a full run statement 
in ONE GO. Almost certainly, something
will go wrong (wrong files selected, syntax
error in the command itself), and you end
up with many wrong output files. Instead,
use THREE STEPS:

1. find the correct file set, by some 
trial and error:
      sfk run "echo $quotfile" mydir
   This will simply show all filenames from 
   "mydir". no command is executed on those
   files, so nothing bad is happening.
   almost certainly, you notice that too
   many files are included. Maybe you have
   to add "-nosub" to exclude subfolders,
   or add more details about your file
   selection, like:
      sfk run "echo $quotfile" mydir .jpg 
      .jpeg
   which reduces the file set to just .jpg 
   and .jpeg files within "mydir".

2. Replace "echo" by the actual command, 
still running in simulation mode.
      sfk run "copy $quotfile \"d:\pic\
      small_$base.jpg\"" mydir .jpg .jpeg
   This simulates a copy of all images from 
   mydir to d:\pic, prefixing their name by
   "small_", and ensuring that all target
   file extensions are only ".jpg".

3. When you're satisfied with the simulation output, add "-yes". Another example: list the methods of all .class files in a directory tree. This time, we take a different approach, starting with "sfk list". To list all . class files in the directory tree "pack", we say: sfk list pack .class This may result in an output like this: pack\Lemon.class pack\Curry.class pack\Yet.class pack\Another.class pack\One.class Our goal is to turn these lines into commands of the form: javap pack.classname So how do we achieve this? First, we have to change the format of the output lines, through adding a "filter" command: sfk list pack .class +filter -rep /\ /./ -rep /.class// This replaces all slashes "\" by a dot ".", and strips off the ".class". Now the resulting output is: pack.Lemon pack.Curry pack.Yet pack.Another pack.One Finally, we pipe this into "run": sfk list pack .class +filt -rep /\/./ -rep /.class// +run "javap $file" The resulting output - a simulated preview - is now: javap "pack.Lemon" javap "pack.Curry" javap "pack.Yet" javap "pack.Another" javap "pack.One" Finally, run the command again, this time adding "-yes": sfk list pack .class +filt -rep /\/./ -rep /.class// +run "javap $file" -yes Which will result in the interface listings of all classes.

you are viewing this page in mobile portrait mode with a limited layout. turn your device right, use a desktop browser or buy the sfk e-book for improved reading.

 
sfk is a free open-source tool, running instantly without installation efforts. no DLL's, no registry changes - just get sfk.exe from the zip package and use it (binaries for windows, linux and mac are included).

 

the Endless Image 🍣 Sushi