検索はコマンドラインではうまく機能しますが、スクリプトでは機能しません。

検索はコマンドラインではうまく機能しますが、スクリプトでは機能しません。

私はDebian Jessieホストでスクリプトを書こうとしています。

スクリプトで次のコマンド(一部のバリエーションあり)を実行する際に問題があります。

find ~/* -path ~/FileSniper* \
-prune -o \
-type f \( -name "*.mp4" -o -name "*.sh" -or -name "*.mp3" \) \
! -name '*.txt' -printf "%f\n"

スクリプトで私がやろうとしているのは、ユーザーが検索したいファイルの種類を入力するようにしてからそれにパイプしてsed正しい形式を取得することです。

 echo "Input the formats like this: \"mp3,mp4,exe,sh\""
        read -p "input:" formats
        formattedformats=`echo "-name \"*.""$formats""\"" | sed 's/,/" -o -name "*./g'`
        find_parameters=(\(formattedformats\))

遺言状には$find_parameters次の内容が含まれます。

-name "*.mp3" -o -name "*.mp4" -o -name "*.sh" 

この行では何が問題なのかわかりません。

find ~/* -path ~/FileSniper* -prune -o -type f  "${find_parameters[@]}" ! -name "*.txt" -printf "%f\n" > foundfiles.txt

可能な限り調査しましたが、まだ問題が何であるかはわかりません。正しい方向を教えてください。

答え1

findこれは(標準入力ではなく)コマンドラインからファイル拡張子を読み取り、それを使用してのオプションで使用する正規表現を作成する-iregexスクリプトです。

元の例に示すように、隠し.ディレクトリを除外します。~/FileSniper*

#! /bin/bash

regexp=''

for ext in "$@" ; do
    [ -n "$regexp" ] && regexp="$regexp\|"
    regexp="$regexp.*\.$ext$"
done

find ~ -not -path '*/.*' -not -path '*/FileSniper*' -type f \
    -iregex "$regexp" > foundfiles.txt

答え2

スクリプトがある#!/bin/shタイプまたは別のタイプの場合は、タイプ名拡張を実装しないデフォルトのシェルインタプリタを使用するDebianシステムで.shスクリプトが実行されない理由を説明します。${find_parameters[@]}dash${array[@]}

-path ~/FileSniper*また、あなたの主張がどのように望ましくない結果をもたらす可能性があるかを知ることができます。~/*今回の場合も同様です。作成したとおり、これは拡張ではなくシェル拡張ですfind。オペランドはfind [ ...paths... ]絶対に拡張されていないので~/*、これが実際に必要なものであれば、できるだけ正確ですが、親シェルが生成できるすべてに-path ~/FileSniper*拡張してください。今後パターンとして使用されますfind。したがって経路と一致しないとどうせそのまま維持される~/ため問題になるが*、もしするこれにより、もはや希望のパターンで機能しなくなります。

引用する必要があります。find ... -path ~/FileSniper\*文字通りのコード名を探したくない~場合は引用しなければなりません。

関連情報