Экранирование одиночной кавычки

Вместо создания строки с параметрами командной строки для игнорирования каталогов с определенными именами используйте массив. Таким образом, параметры для 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 ';' ')'
1
01.03.2018, 13:31
1 ответ

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.

2
27.01.2020, 23:32

Теги

Похожие вопросы