Скопируйте файлы, найденные с помощью find?

Я пытаюсь *.plist скрипт, который рекурсивно находит все файлы *.plist в каталоге и затем работает с ними. Скрипт ниже, но он дает неожиданные результаты.

Ожидаемый результат: каждое имя файла печатается следующим образом:

 File: XXX File: YYY File: ZZZ 

Проблема в том, что for file in "$FILES" не отправляет один файл за раз. Скорее, его отправка во весь список сразу ( FILES были собраны с помощью 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 

Вы создали переменную FILES с единственным значением – весь вывод из find. Одним из решений является использование массивов, например:

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

и позже

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

Обратите внимание, что вам лучше использовать $() для подстановки команд вместо backticks “.

Вероятно, вы ищете функцию -exec в поиске:

 find "$ {DIR}" -name "* .plist" -type f -exec echo "сделать некоторые вещи для" {} \;

Нарушение этого:

  • -типы, чтобы убедиться, что найденная вещь является файлом
  • -exec выполняет код ….
  • эхо "сделать кое-что"
  • {} представляет файл, который работает во время этой итерации
  • \; закрывает оператор кода и возвращает для следующей итерации

Это может упростить ваш скрипт.