スクリプトのシェルコマンドに特殊文字を含む文字列を渡すには?

スクリプトのシェルコマンドに特殊文字を含む文字列を渡すには?

一部の権限の問題をデバッグするのに役立つ小さなスクリプトを作成しています。確認したい親フォルダを渡し、無視したいサブフォルダを指定できます。

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/clfsm3つのサブフォルダがあり、そのうちの2つは除外したいと思いますcmakeinclude以下の出力は2つの部分に分割されます。一番上は、除外するフォルダをフィルタリングしない現在の出力です。 。上記のコードの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

おすすめ記事