Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Q]findの使い方( 初心者)

15 views
Skip to first unread message

Kounosu

unread,
Mar 26, 2000, 3:00:00 AM3/26/00
to
くだらない質問ですが、find の使い方を教えてください。
現在、

>find ./ \( -name "wget-log*" \) -print
./wget-log
./wget-log.1
./wget-log.2

でありまして、これらのファイルを削除したいのです。
しかし、man にしたがってやってみても

>find ./ \( -name "wget-log*" \) -exec \ rm {} \;
find: cannot execute rm:: No such file or directory
find: cannot execute rm:: No such file or directory
find: cannot execute rm:: No such file or directory

となります。

ちなみに rm のかわりに /bin/rm を指定しても

>find ./ \( -name "wget-log*" \) -exec /bin/rm {} \;
find: cannot execute /bin/rm:: No such file or directory
find: cannot execute /bin/rm:: No such file or directory
find: cannot execute /bin/rm:: No such file or directory

です。もちろん /bin/rm はありますし、pathも通っています。
ついでに、なぜ末尾に \; が必要なのかも教えてください。
--
鴻巣
kou...@mutt.freemail.ne.jp

MORI Kouji

unread,
Mar 26, 2000, 3:00:00 AM3/26/00
to
kou...@mutt.freemail.ne.jp (Kounosu) writes:

> くだらない質問ですが、find の使い方を教えてください。

> >find ./ \( -name "wget-log*" \) -print

この場合、括弧で括る必要はありませんよね。

> >find ./ \( -name "wget-log*" \) -exec \ rm {} \;
> find: cannot execute rm:: No such file or directory

^^^
これは ' rm' というコマンドを実行しようとしているので、
こういう結果になります。(なんで \ を?)

> >find ./ \( -name "wget-log*" \) -exec /bin/rm {} \;
> find: cannot execute /bin/rm:: No such file or directory

こっちはわからないです。何か見落としてるのかな…。
環境は何ですか?

> ついでに、なぜ末尾に \; が必要なのかも教えてください。

例えば (意味なさげな例でごめんなさい)

find . -exec echo {} \; -name '*~' -exec rm {} \;

なんてことをしようと思ったら、\; がないと指定できないです。

--
森 浩二 (MORI Kouji)
E-mail: mor...@hh.iij4u.or.jp
+++ under construction +++

ra...@katsurajima.seya.yokohama.jp

unread,
Mar 26, 2000, 3:00:00 AM3/26/00
to
桂島@横浜です.

> >find ./ \( -name "wget-log*" \) -exec \ rm {} \;
> find: cannot execute rm:: No such file or directory
> find: cannot execute rm:: No such file or directory
> find: cannot execute rm:: No such file or directory
>

> となります。

答え:その1

シェルのコマンドラインから入力する場合 '{', '}' は制御用の特殊文字として
扱われてしまいます. そのためこれについては ';' の場合と同様に '\' を使っ
てエスケープしておかなければなりません. 従って答えは

find ./ -name 'wget-log*' -exec rm \{\} \;

になります. ';' の前に '\' が付くのも単体ではシェルに解釈されてしまうの
で, それを防ぐためです.

答え:その2

上記のような単純な条件で, 対象となるファイルの数が多いのであれば

find ./ -name 'wget-log*' -print |xargs rm

とすれば rm を起動することによるオーバヘッドを最小限に押さえることができ
ます.
--
Katsurajima "Raven" Naoto(桂島 直人)
Family Emblem: Circle and Left 3 Clove-TOMOE(丸に左三つ丁子巴)
e-mail: ra...@katsurajima.seya.yokohama.jp


^^ Hiroshi Migimatsu

unread,
Mar 26, 2000, 3:00:00 AM3/26/00
to

| find ./ -name 'wget-log*' -exec rm \{\} \;
| になります.

あれれ、単体で {} と書いて特殊記号に認識される shell って
どれだろう。

# ${var} をはじめとするマクロ置換の用法ならありますけど。
--
みんつ - mi...@minz.org - http://www.minz.org/ - みぎまつ・ひろし

ra...@katsurajima.seya.yokohama.jp

unread,
Mar 26, 2000, 3:00:00 AM3/26/00
to
桂島@横浜です.

> あれれ、単体で {} と書いて特殊記号に認識される shell って
> どれだろう。

あれ, おかしいな... 確かにFreeBSDで確かめてみると ash, bash, csh, tcshと
もに'\'がいらないですね... SystemV Release2 ぐらいの時のバグ満載cshか何
かで覚え込んだのがそのままになっていたようです. 失礼しました (^_^;

Kounosu

unread,
Mar 27, 2000, 3:00:00 AM3/27/00
to
みなさん、どうもありがとうございました。鴻巣です。

In article <874s9v3...@saorin.noe.mcu.or.jp>, MORI Kouji <mor...@hh.iij4u.or.jp> wrote:

|> >find ./ \( -name "wget-log*" \) -exec \ rm {} \;
|> find: cannot execute rm:: No such file or directory

| ^^^
|これは ' rm' というコマンドを実行しようとしているので、
|こういう結果になります。(なんで \ を?)

これが原因でした。でも、これには理由があって、man find の

7. To remove all files named a.out or *.o that have not been accessed
for a week and that are not mounted using nfs, enter:

find / \( -name a.out -o -name '*.o' \) -atime +7 ! -fstype nfs
-exec \ rm {} \;

を参考に、無条件に \ をつけていました。環境は AIX です。
この man はミスプリ??

|> >find ./ \( -name "wget-log*" \) -exec /bin/rm {} \;

|> find: cannot execute /bin/rm:: No such file or directory
|
|こっちはわからないです。何か見落としてるのかな…。
|環境は何ですか?

書き間違えていました。実はこっちにも \ をつけていました。

|find ./ -name 'wget-log*' -print |xargs rm
|
|とすれば rm を起動することによるオーバヘッドを最小限に押さえることができ
|ます.

知らなかった..。今までずっとこれでしのいでいました(涙)。

#!/usr/local/bin/perl
while (<STDIN>) {system("$ARGV[0] $_");}
--
鴻巣
kou...@mutt.freemail.ne.jp

Mori Kouji

unread,
Mar 27, 2000, 3:00:00 AM3/27/00
to
kou...@mutt.freemail.ne.jp (Kounosu) writes:

> これが原因でした。でも、これには理由があって、man find の
>
> 7. To remove all files named a.out or *.o that have not been accessed
> for a week and that are not mounted using nfs, enter:
>
> find / \( -name a.out -o -name '*.o' \) -atime +7 ! -fstype nfs
> -exec \ rm {} \;
>
> を参考に、無条件に \ をつけていました。環境は AIX です。
> この man はミスプリ??

本当は

find / \( -name a.out -o -name '*.o' \) -atime +7 ! -fstype nfs -exec \
rm {} \;

となるはずだったのが man の整形ミスで改行位置が変わってしまったとか。:-)

--
森 浩二 (MORI Kouji)

(株)淺沼組 技術研究所
E-mail: mo...@tri.asanuma.co.jp

Murata Shuuichirou

unread,
Mar 27, 2000, 3:00:00 AM3/27/00
to
In message <8bk5e9$t0i$1...@pooh.isoternet.org>,
`mi...@minz.org' wrote:
> | find ./ -name 'wget-log*' -exec rm \{\} \;
> | になります.
>
> あれれ、単体で {} と書いて特殊記号に認識される shell って
> どれだろう。

わたしの手元にあるものでは、rc というのが {} を特別あつかいし
ていますね。

; rc -V
$Release: @(#)rc 1.6 1999-05-28 $
; ls {}
syntax error
;

こいつは \ で特殊記号をエスケープしてくれないので

find ./ -name 'wget-log*' -exec rm '{}' ';'

のように書かきゃなりません。
--
むらたしゅういちろう

IIJIMA 'Delmonta' Hiromitsu

unread,
Mar 27, 2000, 3:00:00 AM3/27/00
to
いいじま@東大文学部です。

> > >find ./ \( -name "wget-log*" \) -exec /bin/rm {} \;
> > find: cannot execute /bin/rm:: No such file or directory
>
> こっちはわからないです。何か見落としてるのかな…。
> 環境は何ですか?

ついでに別解を。
#ファイル名に空白が混じっている可能性は無視(^^;)

(1)
>rm `find ./ -name "wget-log*" -print`

ファイル数がそんなに多くなければこれが気楽です。

(2) cut and paste ができる環境(xterm など)限定の手抜き法。


>find ./ -name "wget-log*" -print

./wget-log
./wget-log.1
./wget-log.2
>rm `cat`
./wget-log ←上から切り貼りする
./wget-log.1
./wget-log.2
^D

私は軟弱なので最近はこれで間に合わせてます(^^;)

☆-- 飯嶋 浩光 ----------------------------------------------☆
|IIJIMA 'Delmonta' Hiromitsu an der Universitaet Tokyo |
☆-----------------------------------------------------------☆
|【宣伝】Windows 95/98 管理人のための MS-DOS 基礎講座 |
http://user.ecc.u-tokyo.ac.jp/~l94102/dos/
☆-------------------------- L94...@mail.ecc.u-tokyo.ac.jp --☆

0 new messages