私は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\*
文字通りのコード名を探したくない~
場合は引用しなければなりません。