*.plist
私はディレクトリ内のすべてのファイルを再帰的に見つけて作業するスクリプトを1つにまとめようとしています。スクリプトは次のとおりですが、予期しない結果が発生します。
予想される結果は、各ファイル名が次のように印刷されることです。
File: XXX
File: YYY
File: ZZZ
問題for file in "$FILES"
はいいえ一度に1つのファイルを送信します。代わりにリスト全体を一度に送信するので(FILES
collectを使用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[@]}"
$()
バックティックの代わりにコマンドの置き換えを使用する必要があります。