Bashスクリプトからワイルドカード*を呼び出すことはできません。

Bashスクリプトからワイルドカード*を呼び出すことはできません。

名前に「v」を含むファイルを削除するプログラムを作成しようとしています。

私のスクリプトはディレクトリを表示するように要求します。コードは基本的に次のようになります

read -p "directory: " DIRECT

rm *v* $DIRECT

*v*それはファイルやディレクトリの名前だと思い、そのようなものが存在しないことを知らせて、ただその場所に移動してDIRECT削除できないと言います。

答え1

「rm」の代わりに「find」を使用するとどうなりますか?

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

スクリプトは次のとおりです。

read -p "directory: " directory

find "$directory" -name "*v*" -type f -delete

find は開始ディレクトリが存在することを確認し、デフォルトでそのディレクトリのすべてのサブディレクトリを検索します。再帰的に検索したくない場合は、-maxdepth 0検索を開始ディレクトリに限定するオプションを追加する必要があります。上記の例では、-nameフラグを使用してファイル名を検索しましたが、正規表現(-regexオプション)を使用することもできます。ファイルタイプ(フラグ)によって検索を制限することもできます-type。たとえば、-type f検索を通常のファイルに限定します。見つかったファイルを削除することを示すには、-deleteフラグを使用してください。より多くのオプションが必要な場合はsh# man find友達になってください ;)

答え2

そのようなことは起こりませんでしたrm。この試み:

read -p "Directory: " SEARCH_DIR
if [[ -z "$SEARCH_DIR" || ! -d "$SEARCH_DIR" ]]; then
    echo "Error! Please enter a valid directory."
    exit 1
fi
rm "${SEARCH_DIR}/"*v*

rm最後の引数でファイルを見つけるには、rm を使用する場合、特にワイルドカードを使用する場合は、常にフルパスまたは相対パスを使用することをお勧めします。そうしないと、ひどいことが起こる可能性があります。

[root@JBCLAMP001 ~]# rm --help
Usage: rm [OPTION]... FILE...

次のようにすることもできます。

read -p "Directory: " SEARCH_DIR
if [[ -z "$SEARCH_DIR" || ! -d "$SEARCH_DIR" ]]; then
    echo "Error! Please enter a valid directory."
    exit 1
fi
for file in "$SEARCH_DIR/"*; do
    if [ -f "$file" ]; then
        if [[ $(basename $file | grep "v") ]]; then
            rm -f "$file"
        fi
    fi
done

答え3

削除された部分は次のように変更されることがあります。

read -p "directory: " DIRECT

( shopt -s extglob ; rm -f "$DIRECT/"+([!v]) )

サブシェル(…)実行中のシェルの条件は変更されません。

もう一つの方法は find を使うことです。

find . -maxdepth 1 -regex '[^v]+' -type f -exec rm {} +

答え4

rm一致するファイル/ディレクトリがないという苦情を避けるには、*v*このオプションを使用する必要があります-f。これらの潜在的なvファイルを削除するには、$DIRECT以下を実行する必要があります。

read -p "directory: " DIRECT

rm -f "$DIRECT"/*v*

削除する項目が見つからない場合(例:vファイルが欠落しているか、ディレクトリーが欠落している場合$DIRECT

関連情報