View Single Post
Old 3rd March 2005, 14:58   #322
Forum King
xzxzzx's Avatar
Join Date: Aug 2002
Posts: 7,254
Phily, while I agree that it is possible to make a powerful and simple GUI interface, you simply can't match the power of a bash shell (without some fundamental changes to how GUIs operate).

For example, can you explain how to do something like:

1) With case sensitivity, find all files with the word "mouse" in them.
2) In those files, if they have at least 1 instance of the word "elite" in them, change "elite" to "1337", and "owned" to "pwned".

All one really needs to remember here is the name of appropriate commands to do something like this. First, to find the appropriate files, "find". I do "find --help", and get:
legolas root # find --help
Usage: find [path...] [expression]
default path is the current directory; default expression is -print
expression may consist of:
operators (decreasing precedence; -and is implicit where no others are given):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2

options (always true): -daystart -depth -follow --help
-maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xdev
tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N

-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
-ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE

-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
-size N[bckw] -true -type [bcdpfls] -uid N -used N -user NAME
-xtype [bcdpfls]

actions: -exec COMMAND ; -fprint FILE -fprint0 FILE -fprintf FILE FORMAT
-ok COMMAND ; -print -print0 -printf FORMAT -prune -ls

Report bugs to <>.

Ok, so our command will be something like:

find /tmp/1337/ -name mouse -exec (do something)\;

Now, I need to make sure there is an instance of "elite" in the files. "grep" should fit the bill:
legolas root # grep --help
Usage: grep [OPTION]... PATTERN [FILE] ...
Search for PATTERN in each FILE or standard input.
Example: grep -i 'hello world' menu.h main.c

Regexp selection and interpretation:
-E, --extended-regexp PATTERN is an extended regular expression
-F, --fixed-strings PATTERN is a set of newline-separated strings
-G, --basic-regexp PATTERN is a basic regular expression
-P, --perl-regexp PATTERN is a Perl regular expression
-e, --regexp=PATTERN use PATTERN as a regular expression
-f, --file=FILE obtain PATTERN from FILE
-i, --ignore-case ignore case distinctions
-w, --word-regexp force PATTERN to match only whole words
-x, --line-regexp force PATTERN to match only whole lines
-z, --null-data a data line ends in 0 byte, not newline

-s, --no-messages suppress error messages
-v, --invert-match select non-matching lines
-V, --version print version information and exit
--help display this help and exit
--mmap use memory-mapped input if possible

Output control:
-m, --max-count=NUM stop after NUM matches
-b, --byte-offset print the byte offset with output lines
-n, --line-number print line number with output lines
--line-buffered flush output on every line
-H, --with-filename print the filename for each match
-h, --no-filename suppress the prefixing filename on output
--label=LABEL print LABEL as filename for standard input
-o, --only-matching show only the part of a line matching PATTERN
-q, --quiet, --silent suppress all normal output
--binary-files=TYPE assume that binary files are TYPE
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
-I equivalent to --binary-files=without-match
-d, --directories=ACTION how to handle directories
ACTION is 'read', 'recurse', or 'skip'
-D, --devices=ACTION how to handle devices, FIFOs and sockets
ACTION is 'read' or 'skip'
-R, -r, --recursive equivalent to --directories=recurse
--include=PATTERN files that match PATTERN will be examined
--exclude=PATTERN files that match PATTERN will be skipped.
--exclude-from=FILE files that match PATTERN in FILE will be skipped.
-L, --files-without-match only print FILE names containing no match
-l, --files-with-matches only print FILE names containing matches
-c, --count only print a count of matching lines per FILE
-Z, --null print 0 byte after FILE name

Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
-NUM same as --context=NUM
--colour[=WHEN] use markers to distinguish the matching string
WHEN may be `always', `never' or `auto'.
-U, --binary do not strip CR characters at EOL (MSDOS)
-u, --unix-byte-offsets report offsets as if CRs were not there (MSDOS)

`egrep' means `grep -E'. `fgrep' means `grep -F'.
With no FILE, or when FILE is -, read standard input. If less than
two FILEs given, assume -h. Exit status is 0 if match, 1 if no match,
and 2 if trouble.

Report bugs to <>.


find /tmp/1337/ -name mouse -exec grep elite {} \;

Now for the replace. I'll use sed (this one you just have to know, though it's easily found with a Google search):

find /tmp/1337/ -name mouse -exec grep elite {} \;
-exec sed 's/elite/1337/g' {}\; -exec sed 's/owned/pwned/g' {}\;

(broken into two lines for the forum's sake)

Yes, this is more cryptic than using a GUI, but you'd just be opening the second file in Windows when I hit "enter", assuming I didn't know the syntax offhand anyway (which, for this simple of a command, I do). The point is that while a GUI becomes slightly more powerful over use via familiarity, a command line becomes vastly, vastly more powerful.

Can you envision a GUI producing this kind of flexibility and power? I can't. Not without some sort of major shift in GUI style. What's really missing is stdin and stdout. Different GUI pieces don't fit together.

I don't, however, particularly disagree with you on any point you made Phily, as when considering the average user, this would be totally unworkable, and you're right, linux GUIs have a long way to go (I'm pretty familiar with GUI design myself - I've read GUI design books for fun ).

Freedom of speech is the basic freedom of humanity. When you've lost that, you've lost everything.
1\/\/4y 34|<$p4y 1gp4y 33714y, 0d4y 0uy4y? | Roses are #FF0000; Violets are #0000FF; chown -R ${YOU} ~/base
The DMCA. It really is that bad. : Count for your life.
xzxzzx is offline   Reply With Quote