스크립트의 쉘 명령에 특수 문자가 포함된 문자열을 전달하는 방법은 무엇입니까?

스크립트의 쉘 명령에 특수 문자가 포함된 문자열을 전달하는 방법은 무엇입니까?

일부 권한 문제를 디버깅하는 데 도움이 되는 작은 스크립트를 작성 중입니다. 확인하고 싶은 상위 폴더를 전달하고 무시하고 싶은 하위 폴더를 지정할 수 있습니다.

find생성된 인수 문자열 의 일부가 이스케이프 처리되기 때문에 전달하는 데 문제가 있습니다 . find명령을 올바르게 받아들이는 방식으로 명령에 와일드카드를 제공하는 방법을 알 수 없는 것 같습니다 . 와일드카드가 제자리에 있고, 경로 문자열의 해당 부분이 작은 따옴표로 한정되어 있고, 작은 따옴표가 이스케이프되어 '\''혼란스럽습니다(변환을 제어하는 ​​방법을 알 수 없기 때문에). find(이것은 기본적으로 내 제외를 무시합니다.)

저는 작은따옴표, 큰따옴표, 이스케이프 문자에 대한 모든 내용을 읽었지만 나와 비슷한 예를 찾지 못했습니다.

#!/bin/bash -f
# output permissions and ownership with path relative to specified parent.

Usage="$0 <parent path> <excluded child folder> ...."

if [ $# -lt 1 ]
then
    (>&2 echo -e $Usage)
    exit 1
else 
    parent=$1
    shift
    if [ $# -gt 0 ]
    then
        excludes=" ("
        for folder in $@
        do
            thisLine=" ! -path $parent$folder ! -path '$parent$folder/*'"    <=== the '*' wildcard is causing the problem I think.
            excludes=$excludes$thisLine
        done
        excludes=$excludes" )"
    fi
    (>&2 echo "=> find $parent $excludes -ls | awk '{print "'$3"|"$5"|"$6"|"$11}'"'")
    (>&2 echo )
set -vx
    find $parent $excludes -ls | awk '{print $3"|"$5"|"$6"|"$11}'
fi

내가 작업 중인 트리의 분기에는 /home/user/catkin_ws/src/clfsm세 개의 하위 폴더가 있으며 그 중 두 개는 제외하고 싶습니다 cmake. include아래 출력은 두 부분으로 분할됩니다. 맨 위는 제외하려는 폴더를 필터링하지 않는 현재 출력입니다. . 위 코드의 echo 명령줄을 사용하면 아래쪽 부분이 정확합니다.

위 스크립트를 호출하는 명령은 다음과 같습니다 ~/myScripts/show_permissions.sh /media/nap/U14041/home/nap/catkin_ws/src/clfsm /cmake /include. Stephen의 솔루션에서는 선행 없이 제외할 하위 폴더를 지정해야 합니다 /.

user@rMBP-Ubuntu:[12:29]:/home/user/catkin_ws/src/clfsm$ ~/myScripts/show_permissions.sh /home/user/catkin_ws/src/clfsm /cmake /include
=> find /home/user/catkin_ws/src/clfsm  ( ! -path /home/user/catkin_ws/src/clfsm/cmake ! -path '/home/user/catkin_ws/src/clfsm/cmake/*' ! -path /home/user/catkin_ws/src/clfsm/include ! -path '/home/user/catkin_ws/src/clfsm/include/*' ) -ls | awk '{print $3"|"$5"|"$6"|"$11}'

++ find /home/user/catkin_ws/src/clfsm '(' '!' -path /home/user/catkin_ws/src/clfsm/cmake '!' -path ''\''/home/user/catkin_ws/src/clfsm/cmake/*'\''' '!' -path /home/user/catkin_ws/src/clfsm/include '!' -path ''\''/home/user/catkin_ws/src/clfsm/include/*'\''' ')' -ls
++ awk '{print $3"|"$5"|"$6"|"$11}'
drwxrwxr-x|user|user|/home/user/catkin_ws/src/clfsm
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/clfsm.layout
drwxrwxr-x|user|user|/home/user/catkin_ws/src/clfsm/src
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_visitorsupport.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_machine.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_visitors.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_main.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_cc.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/cmake/FindLibDispatch.cmake
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/CMakeLists.txt
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/clfsm_vector_factory.h
drwxrwxr-x|user|user|/home/user/catkin_ws/src/clfsm/include/typeClassDefs
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/typeClassDefs/FSMControlStatus.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/typeClassDefs/FSM_Control.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/typeClassDefs/wb_fsm_control_status.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/typeClassDefs/wb_fsm_state_status.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/CLActionAction.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMWBQueryPredicate.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMSuspensibleMachine.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMWBSubMachine.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/gu_util.h~
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/CLTransitionExpression.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMWBContext.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMState.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMAction.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMExpression.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/clfsm_cc.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMTransition.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/clfsm_visitorsupport.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/stringConstants.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/clfsm_factory.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMFactory.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMachineVector.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMActivity.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/clfsm_visitors.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMachine.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/clfsm_cc_delegate.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/clfsm_machine.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/gu_util.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSMWBPredicate.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/clfsm_wb_vector_factory.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/include/FSM.h
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/package.xml
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/clfsm.cbp

user@rMBP-Ubuntu:[12:34]:/home/user/catkin_ws/src/clfsm$ find /home/user/catkin_ws/src/clfsm  \( ! -path /home/user/catkin_ws/src/clfsm/cmake ! -path '/home/user/catkin_ws/src/clfsm/cmake/*' ! -path /home/user/catkin_ws/src/clfsm/include ! -path '/home/user/catkin_ws/src/clfsm/include/*' \) -ls | awk '{print $3"|"$5"|"$6"|"$11}'
drwxrwxr-x|user|user|/home/user/catkin_ws/src/clfsm
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/clfsm.layout
drwxrwxr-x|user|user|/home/user/catkin_ws/src/clfsm/src
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_visitorsupport.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_machine.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_visitors.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_main.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/src/clfsm_cc.cc
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/CMakeLists.txt
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/package.xml
-rw-rw-r--|user|user|/home/user/catkin_ws/src/clfsm/clfsm.cbp
user@rMBP-Ubuntu:[12:35]:/home/user/catkin_ws/src/clfsm$ 

답변1

이 요구 사항을 올바르게 이해했다면 -path ... -prune중지를 사용하여 트리로 내려가야 합니다.

그것은 다음과 같습니다:

#!/bin/bash -f
# output permissions and ownership with path relative to specified parent.

Usage="$0 <parent path> <excluded child folder> ...."

if [ $# -lt 1 ]
then
    (>&2 echo -e $Usage)
    exit 1
else 
    parent=$1
    shift
    if [ $# -gt 0 ]
    then
        for folder in $@
        do
            thisLine=" ( -path $parent/$folder -prune ) -o"
            excludes=$excludes$thisLine
        done
    fi
set -vx
    find $parent $excludes -ls | awk '{print $3"|"$5"|"$6"|"$11}'
fi

아이디어는 비슷한 것을 만드는 것입니다

find /tmp/A \( -path /tmp/A/skip1 -prune \) -o -ls

관련 정보