Вместо создания строки с параметрами командной строки для игнорирования каталогов с определенными именами используйте массив. Таким образом, параметры для find
, которые вы добавляете динамически из командной строки, будут правильно разделены.
Следующий сценарий является очень простым и использует один путь поиска, целевой каталог, за которым следует любое количество имен каталогов, которые следует игнорировать. Код создает набор опций для find
в $@
, массиве позиционных параметров.
#!/usr/bin/ksh
searchpath=$1
destdir=$2
shift 2
ignore=( brmsdeploy TempJobs tmp logs deploy )
if [ ! -d "$destdir" ]; then
printf 'Destination directory "%s" does not exist\n' >&2
exit 1
fi
# Process the directories to ignore from the command line.
# This replaces the positional parameters.
for name do
set -- "$@" -o -name "$name"
shift
done
# Process the directories that we always ignore.
# This adds to the positional parameters.
for name in "${ignore[@]}"; do
set -- "$@" -o -name "$name"
done
shift # shift off the first -o
find "$searchpath" \( -type d \( "$@" \) -prune \) -o \
\( -type f -name '*.properties' -exec cp {} "$destdir" \; \)
Для использования:
./script.sh /path/to/topdir /path/to/destdir somename someothername fluff
Это приведет к выполнению find
, игнорируя каталоги с именами somename
, someothername
и fluff
. Обратите внимание, что это также позволяет этим именам содержать пробелы, табуляции и новые строки (, если они указаны в командной строке ).
Фактическая команда find
, выполняемая этой командой, будет
find /path/to/topdir '(' -type d '(' -name somename -o -name someothername -o -name fluff -o -name brmsdeploy -o -name TempJobs -o -name tmp -o -name logs -o -name deploy ')' -prune ')' -o '(' -type f -name '*.properties' -exec cp '{}' /path/to/destdir ';' ')'
No puede citar *
si espera que actúe como comodín. Se le escapan tanto las comillas simples como las dobles.
Las comillas dobles también escapan de las comillas simples, por lo que toda la cadena *\'*
se tomará literalmente:
$ echo "*\'*"
*\'*
Desea escribir su cadena sin las comillas dobles como ha escrito más adelante en su pregunta:
ls -l *\'*
Otra forma de hacer esto que puede ser más adecuada para usted es con el comando find
. (que no sigue las mismas reglas de cotización que las anteriores, lo siento por la confusión ). Con find puede buscar una estructura de directorio de forma recursiva mucho más fácil para cualquier archivo que contenga una comilla simple con el siguiente comando:
find. -name "*'*"
En este ejemplo, .
representa el directorio en el que se encuentra actualmente, pero puede reemplazarlo con una ruta a cualquier directorio en el que desee buscar.