返されたファイルを見つけるために繰り返しますか?

返されたファイルを見つけるために繰り返しますか?

*.plist私はディレクトリ内のすべてのファイルを再帰的に見つけて作業するスクリプトを1つにまとめようとしています。スクリプトは次のとおりですが、予期しない結果が発生します。

予想される結果は、各ファイル名が次のように印刷されることです。

File: XXX
File: YYY
File: ZZZ

問題for file in "$FILES"いいえ一度に1つのファイルを送信します。代わりにリスト全体を一度に送信するので(FILEScollectを使用find)、結果は次のようになります。

File: XXX
YYY
ZZZ

実際の出力は下に示されていますが、上記の出力はそれの正確な要約です。

変数の各ファイルを介してシェルループを作成するにはどうすればよいですかFILES


#! /bin/sh

do_test_file() {
  FILE="$1"
  echo "File: $FILE"
  # echo `ls -al "$FILE"`
  echo ""
}

do_test_dir() {
  DIR="$1"
  FILES=`find "$DIR" -name "*.plist" 2>/dev/null`

  for file in "$FILES"
  do

    if [ ! -d "$file" ] && [ ! -L "$file" ]; then
      do_test_file "$file"
    fi

  done
}

########################################

ARG="$1"
if [ -z "$ARG" ]; then
  echo "Please invoke with a file or directory to search"
  exit 1
fi

if [ -d "$ARG" ]; then
  do_test_dir "$ARG"
else
  do_test_file "$ARG"
fi

$ ./plist-dump.sh .

File: ./916CD34C-4D41-41B7-9266-2DCAC416E2D1/.com.apple.mobile_container_manager.metadata.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/iTunesMetadata.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/ResourceRules.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/Info.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/Settings.bundle/Root.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/SC_Info/Manifest.plist

答え1

おそらく、find自体で-exec関数を探しているでしょう。

find "${DIR}" -name "*.plist" -type f -exec echo "何かしてください" {} \;

それを破壊する:

  • -見つかったものがファイルであることを確認するためのタイプテスト
  • -execはコードを実行します。
  • エコ「何をしてみて」
  • {}は、この反復中に作業しているファイルを表します。
  • \;コードステートメントを閉じて、次の繰り返しに戻ります。

これにより、スクリプトを簡素化できます。

答え2

単一の値(findのフル出力)を使用して変数FILESを生成します。 1つの解決策は配列を使用することです。たとえば、次のようになります。

FILES=($(find . -name "*.txt" 2>/dev/null))

そして後で

for file in "${FILES[@]}"

$()バックティックの代わりにコマンドの置き換えを使用する必要があります。

関連情報