ファイル検索、ディレクトリ除外

ファイル検索、ディレクトリ除外

変数にコマンドラインパラメータ文字列を作成し、それを使用してコマンドを実行したいと思います。以下に簡単な例を示します。これは「listfiles」というスクリプトです。ファイルを一覧表示せずに「ignore」というファイルを読み、それ以外のすべてのファイルを一覧表示する必要があります。私がしたいことを達成するための最良の方法は何ですか?

ignorelist=( `cat "./ignore" `)
for LINE in "${ignorelist[@]}"
        do
                Ignore="$Ignore -path '$LINE' -prune -o ";
        done
   
find ${Ignore} -print

ファイルの内容(ディレクトリ名2つ)を無視します。

./d1
./d2

bash -xリストファイルの出力:

+ ignorelist=(`cat "./ignore" `)
++ cat ./ignore
+ for LINE in '"${ignorelist[@]}"'
+ Ignore=' -path '\''./d1'\'' -prune -o '
+ for LINE in '"${ignorelist[@]}"'
+ Ignore=' -path '\''./d1'\'' -prune -o  -path '\''./d2'\'' -prune -o '
+ find -path ''\''./d1'\''' -prune -o -path ''\''./d2'\''' -prune -o -print
.
./1
./2
./3
./d1
./d1/4
./d1/d1a
./d1/d1a/5
./d2
./ignore
./listfiles

d1、d2、および下のすべての内容が出力に含まれないようにするか、無視ファイル内のすべてのファイル/ディレクトリが出力に含まれないようにします。コマンド全体をvarに保存して評価する方が良いですか?

答え1

常に配列を使用して、以下を保存します。分離。ビルドに有効なオプションセットがあることを確認してくださいfind。パラメーターに追加の引用符を含めないでください。これにより、最終的にコマンドが失敗します。

#!/bin/bash

readarray -t ignorepaths <./ignore

ignoreopts=()
for pathname in "${ignorepaths[@]}"; do
        ignoreopts+=( -o -path "$pathname" )
done

find . \( "${ignoreopts[@]:1}" \) -prune -o -print

また、見ることができます


のため/bin/sh

#!/bin/sh

set --
while IFS= read -r pathname; do
    set -- "$@" -o -path "$pathname"
done <./ignore

shift

find . \( "$@" \) -prune -o -print

関連情報