- PR -

solarisのfindコマンド

1
投稿者投稿内容
odik
ベテラン
会議室デビュー日: 2005/02/07
投稿数: 69
投稿日時: 2006-11-14 22:06
solaris9のfindコマンドについて以下の要件を
満たす方法をご教授下さい。
「特定のディレクトリのみを検索対象とし、下位のディレクトリ
を検索対象としない方法」

具体例)
/home/export/a/x.doc
/home/export/a/b/y.doc
があります。

/home/export/a/x.doc
のみを検索結果として出力したい。

find /home/export/a/ -name '*doc'
とすると
/home/export/a/x.doc
/home/export/a/b/y.doc
が検索されてしまいます。

linuxなら、「-maxdepth 1」があるのですが
solaris9にはありません。
スクリプトで2〜3行になってもよいです。

宜しくお願いいたします。
がちょん
会議室デビュー日: 2006/07/17
投稿数: 13
投稿日時: 2006-11-14 23:21
solaris 9のmanのexampleに希望に近いものがあるように思います。
http://docs.sun.com/app/docs/doc/816-5211/6mbcci3bj
Ay
常連さん
会議室デビュー日: 2006/10/29
投稿数: 45
投稿日時: 2006-11-15 01:39
引用:

odikさんの書き込み (2006-11-14 22:06) より:
「特定のディレクトリのみを検索対象とし、下位のディレクトリ
を検索対象としない方法」



その要件なら、lsでよさそうなのですが、ダメなのでしょうか?

コード:
% ls /home/export/a/*doc


odik
ベテラン
会議室デビュー日: 2005/02/07
投稿数: 69
投稿日時: 2006-11-15 09:43
がちょんさん
Ayさん
ご返信頂きまして有難うございます。

>solaris 9のmanのexampleに希望に近いものがあるように思います。
>http://docs.sun.com/app/docs/doc/816-5211/6mbcci3bj

Note: このドキュメントの要求された部分は見つかりませんでした。
と表示されてしまいました。
以下のことですか?
example% find . ! -local -prune -o -print

実際に、
cd /home/export/a
find . -name "*doc" ! -local -prune -o -print
としてみましたが、
x.doc
y.doc
も検出されてしまいます。
(使い方の誤りか?)


>その要件なら、lsでよさそうなのですが、ダメなのでしょうか?

実はfindで検索して、ヒットするものを削除したいのです。
具体的には
find /home/export/a/ -name '*doc' -mtime +30 -exec rm -f {} \;

lsだと-mtimeやexecが使えないので、なんとかfindで出来ないものかと
考えております。
がちょん
会議室デビュー日: 2006/07/17
投稿数: 13
投稿日時: 2006-11-16 00:29
すいません。リンクが間違っていました。

以下のEXAMPLE 3です
http://docs.sun.com/app/docs/doc/816-5211/6mbcci3bj?q=prune+find&a=view
Ay
常連さん
会議室デビュー日: 2006/10/29
投稿数: 45
投稿日時: 2006-11-16 23:49
やや後向きな解決手段として、GNU の fileutilsをインストールする方法はいかがでしょうか。
と思ったら、coreutilsに統合されてるみたいでした…

これなら -maxdepth が使えると思います。
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-11-17 02:07
引用:

スクリプトで2〜3行になってもよいです


引用:

>その要件なら、lsでよさそうなのですが、ダメなのでしょうか?

実はfindで検索して、ヒットするものを削除したいのです。
具体的には
find /home/export/a/ -name '*doc' -mtime +30 -exec rm -f {} ;

lsだと-mtimeやexecが使えないので、なんとかfindで出来ないものかと
考えております。




こんばんは。
こんなかんじのシェルスクリプトではダメでしょうか?
(検証してないので、xargs rm -f じゃなくて、xargs ls -l で確認してください)
コード:

#!/bin/sh
top_dir=/home/export/a
for elem in `ls $top_dir/*.txt`; do
find $top_dir -type f -name `basename $elem` -mtime +30 | xargs rm -f
done
exit




[ メッセージ編集済み 編集者: 温州蜜柑 編集日時 2006-11-17 02:08 ]
odik
ベテラン
会議室デビュー日: 2005/02/07
投稿数: 69
投稿日時: 2006-11-17 10:05
がちょんさん
Ayさん
温州蜜柑さん
ご返信頂きまして有難うございます。

>以下のEXAMPLE 3です
確認しました。
find /home/export/a/ -name b -prune -o -name "*.doc" -print
bディレクトリ配下を検索しなくなり、期待する結果が得られました。
具体例ではbディレクトリを指定できましたが、実は今後どのような名前の
ディレクトリが作成されるか不明です。今はbを指定できましたが
cやdといったディレクトリが作成されるかもしれないのです。
(説明不足ですみません。)
作成したスクリプトをcronに登録する予定ですので、意図しない
ディレクトリが作成されたときに対処が出来なくなってしまうのです。


>coreutilsに統合されてるみたいでした…
自分の判断でツールをインストールできない環境ですので、
残念ながらこれは出来ないのです。
(説明不足ですみません。)

>for elem in `ls $top_dir/*.txt`; do
> find $top_dir -type f -name `basename $elem` -mtime +30 | xargs rm -f
>done
確認しました。
期待する結果が得られました。
ただ、以下のようなディレクトリ及びファイルが作成されてしまった
場合、意図しない結果となってしまいます。
/home/export/a/x.doc
/home/export/a/bkup/x.doc ←誰かが新規作成
誰かが意図的に作成した/bkup/x.docが削除されてしまう。
(これも想定の説明不足ですみません。)

それで、皆さんの意見を参考にさせて頂き、
以下で対処することにしました。
cd /home/export/a
find . -name "*.doc" -mtime +30 -print | while read F;
do
echo $F | grep .*[/].*[/].* > /dev/null 2>&1
if [ $? -ne 0 ]; then
rm -f $F
fi
done

皆さん色々とご教授頂きまして有難うございました。
感謝!感謝です
1

スキルアップ/キャリアアップ(JOB@IT)