1

以下は、30 日以上前のファイルを検索し、ファイルの数またはゼロを返す簡単なスクリプトです。

可能であれば、次のことを行いたいと思います。

  • 30 日より古いものが見つかった場合はループを終了し、list.dat の次の行に移動します。

この方法では、探しているものが見つかったので、誰かのディレクトリをさらに再帰する必要はありません。これらのディレクトリの一部は巨大で、古い SAN を使用しているため、氷河です。

基本的に、30 日以上使用されていない「ホーム」フォルダのレポートを生成しようとしていますが、これ以外の方法でこの情報を抽出することはできません。

これを簡単にするために「検索」の終了ステータスを取得する方法はないと思います...

または、これを別の方法で行う方法について提案がある場合は、私はすべて耳にします。

提案、アイデア、または助けていただければ幸いです。

ダン

#!/bin/sh
PATH=/bin:/usr/bin:/usr/sbin export PATH
SOURCEDIR=/Volumes/UserHomes/

while IFS= read -r line

do

  COUNT=$(find $SOURCEDIR/$line -type f -mtime -30 | wc -l)
  if [ "$COUNT" -eq 0 ]; then
     echo $line ZERO
  else
     echo $line $COUNT files found
  fi

done < $SRCLIST
4

2 に答える 2

4

のコマンド ライン-quitにオプションを追加してみてください。find最初に一致するファイルが見つかると終了します。-print見つかった名前が出力されるように追加する必要があります。

これにより、式を簡素化できます。

if [ -n  "$(find ${SOURCEDIR}/${line} ... -print -quit)" ] ; then
  echo "Something found in ${line}!"
fi

これは、アイデアを示す最小限の概念実証の例です。

# get us an empty dir
mkdir find-example
cd find-example

# create / freshen a few files
touch foo bar baz

# create a subdir with a matching file
mkdir -p nested
touch nested/quux

# finds four files:
find . -type f -mtime -30
# prints:
# ./foo
# ./nested/quux
# ./baz
# ./bar

# finds only one file and stops
find . -type f -mtime -30 -print -quit

# prints:
# ./foo
# and exits.

上記は GNU/Linux、特に Ubuntu 12.04 で再現可能です。

並行してサブディレクトリのスキャンを高速化するために分岐する可能性があり、それらの1つで遭遇しfindた後、他の検索プロセスがしばらく続く可能性があると想像できます。すべてのサブプロセスを終了すると明示的に述べていますが、これはすぐには発生しない可能性があります。これは私の推測にすぎません。大きなツリーでテストしたり、ソースを見たりしませんでした。の後に再帰的な降下が続くのを見たことがありません。OSXまたはBSD + GNU findutilsで試したことはありません。YMMV。-quitman 1 find-quitfind-quit

于 2013-05-04T03:46:24.920 に答える