locate gtags
would find all the files named gtags
.
What if I only need executables, is there any way to do this?
locate
locate gtags
would find all the files named gtags
.
What if I only need executables, is there any way to do this?
There is no option to use locate
to find selected type of file (like directory), but you can use syntax from your question - Dropnot$
to find lines that ends with Dropnot
. For that you must use -e
option to locate to turn on POSIX regular expression.
In this case you should use:
locate -e Dropnot$
It is important what version of locate you have. In my system (Gentoo Linux) I have Secure Locate:
$ locate --version
Secure Locate 3.1 - Released March 7, 2006
in which there is no --basename
option from uther
's answer. This option is provided by GNU Locate from findutils package:
$ ./locate --version
locate (GNU findutils) 4.4.2
If you want to use regexp with GNU Locate you should use -r
switch instead -e
.
I've had this in my ~/.screenrc
for a while:
bind -c pasteline 1 eval copy 'stuff "-Y"' 'paste .'
bind -c pasteline 2 eval copy 'stuff "2-Y"' 'paste .'
bind -c pasteline 3 eval copy 'stuff "3-Y"' 'paste .'
bind -c pasteline 4 eval copy 'stuff "4-Y"' 'paste .'
bind -c pasteline 5 eval copy 'stuff "5-Y"' 'paste .'
bind -c pasteline 6 eval copy 'stuff "6-Y"' 'paste .'
bind -c pasteline 7 eval copy 'stuff "7-Y"' 'paste .'
bind -c pasteline 8 eval copy 'stuff "8-Y"' 'paste .'
bind -c pasteline 9 eval copy 'stuff "9-Y"' 'paste .'
bindkey ¬ command -c pasteline
Basically, typing ¬1 from within screen, inserts the first line above the cursor, ¬2 the second line and so on.
In my ~/.Xdefaults
, I also have:
XTerm.VT100.translations: #override\
Meta <KeyPress> /: dabbrev-expand()
Which lets xterm
complete (upon Alt+/) on what's on the screen (looking backward from the cursor position).
With zsh
, when used within screen
, you could do:
copy-screen() {
screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
killring=(${(Oaf)"$(<~/.lastoutput)"})
CUTBUFFER=$killring[1]
killring[1]=()
}
zle -N copy-screen
bindkey '\ec' copy-screen
to bind Alt+C to that widget that stores the lines above the cursor into the cut buffer and the kill ring (what you paste with Ctrl+Y and cycle through with Alt+Y in emacs
mode). (the above assumes screen
was started from your home directory).
If the inserted text needs to be quoted (because it contains spaces or other special shell characters for instance), you can type Alt+" for zsh
to quote it.
As an example, you've just run:
$ find /usr/local -size +1M
/usr/local/lib/liblzma.a
/usr/local/share/doc/sudo/ChangeLog
/usr/local/share/perl/5.18.2/Unicode/Unihan/Definition.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_TSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/HanYu.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/RSUnicode.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRG_GSource.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGKangXi.db
/usr/local/share/perl/5.18.2/Unicode/Unihan/IRGHanyuDaZidian.db
And you want to open vim
on that sudo ChangeLog above. With the first approach you'd type:
vim ¬9
With the second approach:
vim /usAlt+/
And repeat that Alt+/ until you get to the changelog.
With the third approach:
vim Alt+CCtrl+YAlt+Y
And repeat that Alt+Y until you get to the changelog.
The last approach can be used for your $s1
query.
Instead of storing in the killring
array, store in an array (like $s
) and use $s[1]
for the first line, $s[2]
for the second...
copy-screen() {
screen -X eval copy 'stuff "-$ H\r"' 'writebuf .lastoutput'
s=(${(Oaf)"$(<~/.lastoutput)"})
}
zle -N copy-screen
bindkey '\ec' copy-screen
That Alt+C stores the lines above the cursor in the s
array.
In any case, what we're retrieving is what is displayed on the screen, which is not necessarily the same as what the last command output. For instance printf 'a\bc \n'
outputs 5 bytes a
, BS, c
, SPC and LF, but displays just a c
.
Best Answer
Not easily. You can use
to find all executables where the name contains
bash
. This is faster than usingfind
across the whole filesystem because only a few files need to be checked.locate bash
does what it always does (lists all matches)|
(pipe) takes the output from the first command (locate
) and sends it to the second one (the rest of the line)while ...; do ... done
loop iterates over every line it receives from the pipe (fromlocate
)read -r line
reads one line of input and stores it in a variable calledline
(in our case, a path/file name)[[ -x "$line" ]]
tests whether the file in$line
is executable&& echo $line
part prints it on your screen