Объединение параметров команды unix find - PullRequest
0 голосов
/ 08 июля 2019

Я написал скрипт bash для запуска на macOS 10.l0.5. Я надеялся упростить сценарий. В приведенном ниже примере сценария первый вызов команды find дает желаемый результат. В исходном скрипте у меня есть несколько команд поиска с одним и тем же набором каталогов. Я надеялся поместить их в переменную. Вторая команда поиска показывает мою неудачную попытку.

Я не знаю, почему это не удалось.

Для меня приемлем любой способ обмена общими параметрами между несколькими командами поиска. Нет, я не хочу исключать все скрытые каталоги.

Я запускаю это с внешней флешки. Этот скрипт только для чтения.

#! /bin/bash

sourceDir="/Volumes/DOSDISK"

echo "--------------- find works as expected ------------------------------"
find ${sourceDir} \
 ! -path "${sourceDir}/.Trashes" \
 ! -path "${sourceDir}/.Trashes/*" \
 ! -path "${sourceDir}/.Spotlight-V100" \
 ! -path "${sourceDir}/.Spotlight-V100/*" \
 ! -path "${sourceDir}/.fseventsd" \
 ! -path "${sourceDir}/.fseventsd/*" \
 -type d \
 -exec echo {} \;


echo "----------------------------- does not skip hidden directories -----------"
dirsToSkip=" ! -path \"${sourceDir}\" "
echo "dirsToSkip is -1->${dirsToSkip}"
dirsToSkip="${dirsToSkip}! -path \"${sourceDir}/.Trashes\" "
echo "dirsToSkip is -2->${dirsToSkip}"
dirsToSkip="${dirsToSkip}! -path \"${sourceDir}/.Trashes/*\" " 
echo "dirsToSkip is -3->${dirsToSkip}"
dirsToSkip="${dirsToSkip}! -path \"${sourceDir}/.Spotlight-V100\" " 
echo "dirsToSkip is -4->${dirsToSkip}"
dirsToSkip="${dirsToSkip}! -path \"${sourceDir}/.Spotlight-V100/*\" " 
echo "dirsToSkip is -5->${dirsToSkip}"
dirsToSkip="${dirsToSkip}! -path \"${sourceDir}/.fseventsd\" " 
echo "dirsToSkip is -6->${dirsToSkip}"
dirsToSkip="${dirsToSkip}! -path \"${sourceDir}/.fseventsdf/*\" " 
echo "dirsToSkip is -7->${dirsToSkip}"

echo "see in print ---> "find ${sourceDir} \
 ${dirsToSkip} \
 -type d \
 -exec echo {} \;
echo -e "\n The non-working thing. "
find ${sourceDir} \
 ${dirsToSkip} \
 -type d \
 -exec echo {} \;

вывод. При добавлении отладки в скрипт #! / bin / bash -v -x, я заметил! печатается как «!».

mac $  ./config/trybash.bash
--------------- find works as expected ------------------------------
/Volumes/DOSDISK
/Volumes/DOSDISK/level2
/Volumes/DOSDISK/level3
----------------------------- does not skip hidden directories -----------
dirsToSkip is -1-> ! -path "/Volumes/DOSDISK" 
dirsToSkip is -2-> ! -path "/Volumes/DOSDISK" ! -path "/Volumes/DOSDISK/.Trashes" 
dirsToSkip is -3-> ! -path "/Volumes/DOSDISK" ! -path "/Volumes/DOSDISK/.Trashes" ! -path "/Volumes/DOSDISK/.Trashes/*" 
dirsToSkip is -4-> ! -path "/Volumes/DOSDISK" ! -path "/Volumes/DOSDISK/.Trashes" ! -path "/Volumes/DOSDISK/.Trashes/*" ! -path "/Volumes/DOSDISK/.Spotlight-V100" 
dirsToSkip is -5-> ! -path "/Volumes/DOSDISK" ! -path "/Volumes/DOSDISK/.Trashes" ! -path "/Volumes/DOSDISK/.Trashes/*" ! -path "/Volumes/DOSDISK/.Spotlight-V100" ! -path "/Volumes/DOSDISK/.Spotlight-V100/*" 
dirsToSkip is -6-> ! -path "/Volumes/DOSDISK" ! -path "/Volumes/DOSDISK/.Trashes" ! -path "/Volumes/DOSDISK/.Trashes/*" ! -path "/Volumes/DOSDISK/.Spotlight-V100" ! -path "/Volumes/DOSDISK/.Spotlight-V100/*" ! -path "/Volumes/DOSDISK/.fseventsd" 
dirsToSkip is -7-> ! -path "/Volumes/DOSDISK" ! -path "/Volumes/DOSDISK/.Trashes" ! -path "/Volumes/DOSDISK/.Trashes/*" ! -path "/Volumes/DOSDISK/.Spotlight-V100" ! -path "/Volumes/DOSDISK/.Spotlight-V100/*" ! -path "/Volumes/DOSDISK/.fseventsd" ! -path "/Volumes/DOSDISK/.fseventsdf/*" 
see in print ---> find /Volumes/DOSDISK ! -path "/Volumes/DOSDISK" ! -path "/Volumes/DOSDISK/.Trashes" ! -path "/Volumes/DOSDISK/.Trashes/*" ! -path "/Volumes/DOSDISK/.Spotlight-V100" ! -path "/Volumes/DOSDISK/.Spotlight-V100/*" ! -path "/Volumes/DOSDISK/.fseventsd" ! -path "/Volumes/DOSDISK/.fseventsdf/*" -type d -exec echo {} ;

 The non-working thing. 
/Volumes/DOSDISK
/Volumes/DOSDISK/.Trashes
/Volumes/DOSDISK/.Trashes/501
/Volumes/DOSDISK/.Trashes/501/.Spotlight-V100
/Volumes/DOSDISK/.Trashes/501/.Spotlight-V100/Store-V2
/Volumes/DOSDISK/.Trashes/501/.Spotlight-V100/Store-V2/FF996064-BEDD-474E-9E76-7F8ABD688B09
/Volumes/DOSDISK/.Spotlight-V100
/Volumes/DOSDISK/.Spotlight-V100/Store-V2
/Volumes/DOSDISK/.Spotlight-V100/Store-V1
/Volumes/DOSDISK/.fseventsd
/Volumes/DOSDISK/level2
/Volumes/DOSDISK/level3
mac $ 

1 Ответ

0 голосов
/ 08 июля 2019

С помощью советов, полученных в этой теме, я разработал этот скрипт. Для запуска вам нужно изменить переменную sourceDir на путь одного из ваших каталогов. Это скрипт только для печати на консоли.

#! /bin/bash
#
# Answer to my question:
#   /9328431/obedinenie-parametrov-komandy-unix-findcomment100396210_56926105
#  see Gordon Davisson's comment
#
sourceDir="/Volumes/DOSDISK"

echo "--------------- find works as expected ------------------------------"
find ${sourceDir} \
 ! -path "${sourceDir}" \
 ! -path "${sourceDir}/.Trashes" \
 ! -path "${sourceDir}/.Trashes/*" \
 ! -path "${sourceDir}/.Spotlight-V100" \
 ! -path "${sourceDir}/.Spotlight-V100/*" \
 ! -path "${sourceDir}/.fseventsd" \
 ! -path "${sourceDir}/.fseventsd/*" \
 -type d \
 -exec echo {} \;


echo "----------------------------- Another way to skip hidden directories -----------"
# You place one and only one argument in each array element.
# avoid add extraneous leading and trailing blanks.
# No need to double quote strings.
#

fileargs=()

fileargs+=("!")
fileargs+=("-path") 
fileargs+=("${sourceDir}/.Trashes")

fileargs+=("!")
fileargs+=("-path") 
fileargs+=("${sourceDir}/.Trashes/*")

fileargs+=("!")
fileargs+=("-path") 
fileargs+=("${sourceDir}/.Spotlight-V100")

fileargs+=("!")
fileargs+=("-path") 
fileargs+=("${sourceDir}/.Spotlight-V100/*")

fileargs+=("!")
fileargs+=("-path") 
fileargs+=("${sourceDir}/.fseventsd")

fileargs+=("!")
fileargs+=("-path") 
fileargs+=("${sourceDir}/.fseventsdf/*" )

echo "fileargs are -->${fileargs[@]}<--"

# This invocation is optional.  Remove comments to see 
# the arguments printed out
# you will need the associated bash file.
#echo -e "\n Print args. "
#/Users/mac/config/displayinput.bash ${sourceDir} \
#  ! -path "${sourceDir}" \
# "${fileargs[@]}" \
# -type d \
# -exec echo {} \;

echo -e "\n A second working thing. \n"
find ${sourceDir} \
  ! -path "${sourceDir}" \
 "${fileargs[@]}" \
 -type d \
 -exec echo {} \;

exit 0

Вот необязательный скрипт displayinput.bash

#! /bin/bash

# display input
echo -e "\nin displayinput.bash"
echo -e "\nall args -->${*}<--\n"

declare -i position
position="1";

while [[ $# -gt 0 ]]
do
  key="$1"
  echo "input #${position} token ${1}"
  shift # past argument
  position="position + 1";
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...