我正在尝试拼凑一个脚本,该脚本递归地查找*.plist
目录中的所有文件,然后对它们进行操作。脚本如下,但它产生了意想不到的结果。
预期结果是每个文件名打印如下:
File: XXX
File: YYY
File: ZZZ
问题for file in "$FILES"
是不是一次发送一个文件。相反,它一次发送整个列表(FILES
使用 收集find
),所以我得到的输出如下:
File: XXX
YYY
ZZZ
真实的输出如下所示,但上面是对其的准确摘要。
如何使 shell 循环遍历变量中的各个文件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
您创建了具有单个值的变量 FILES - find 的整个输出。一种解决方案是使用数组,例如:
FILES=($(find . -name "*.txt" 2>/dev/null))
以及后来
for file in "${FILES[@]}"
请注意,您应该使用$()
命令替换而不是反引号``。