循环查找返回的文件?

循环查找返回的文件?

我正在尝试拼凑一个脚本,该脚本递归地查找*.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[@]}"

请注意,您应该使用$()命令替换而不是反引号``。

相关内容