名前に特定の文字列を含むファイルを見つけて対話的に削除するBashスクリプト

名前に特定の文字列を含むファイルを見つけて対話的に削除するBashスクリプト

2つのパラメータを使用するスクリプトを作成する必要がありますbash。 1つはファイル名を検索する文字列、次は検索するファイルパスです。次に、一致するファイルを一度に1つずつ繰り返して印刷し、ユーザーに削除するかどうかを尋ねる必要があります。

例は次のとおりです。

./scriptName.sh foo /path/to/directory/

/path/to/directory/foo.txt

Delete this? (y/n)

user input

/path/to/directory/foop.txt

Delete this? (y/n)

user input

etc...

私は最初に試しました

find $2 -type f -name "*$1*" -print

そして

find $2 -type f -name "*$1*" -delete

ここでは、$1スクリプトの最初のパラメータ、および2番目のパラメータです。$2

これは、見つかった各ファイルを個別に一覧表示して削除するように求めるメッセージが表示されることに気付くまで機能しました。これは、コードの最初の2行が一致するすべてのファイルを一度に削除したため、問題でした。

ベストアンサー1

toを使用して見つかったパス名を-ok実行するか、toexecuteを使用できます。rm-execrm -i

これはそれぞれの簡単な例を示しており、$searchpath検索パスは次$patternのとおりです。決定的な名前パターン(例"*$1*":)。

-ok:を使用すると同様の-ok操作が実行されますが、指定されたユーティリティを実行する前にまずユーザーの確認を要求します。これを使用して、見つかった各パス名を個別に実行します。find-execrm

find "$searchpath" -type f -name "$pattern" -ok rm {} \;

使用rm -i:rmファイルを削除する前に、ユーティリティ自体から確認を要求します。一括パス名にこれを使用できます。

find "$searchpath" -type f -name "$pattern" -exec rm -i {} +

もちろん、独自のプロンプトを実装することもできます。以下は、bash単一ファイルの削除を要求するスクリプトです"$pathname"

read -p "Delete the file at $pathname? y/[n]: "
[[ "$REPLY" == [yY]* ]] && rm "$pathname"

find一括パス名に対してこのメ​​ソッドを呼び出します。

find "$searchpath" -type f -name "$pattern" -exec bash -c '
    for pathname do
        read -p "Delete the file at $pathname? y/[n]: "
        [[ "$REPLY" == [yY]* ]] && rm "$pathname"
    done' bash {} +

ユーザーが大文字または小文字で始まる文字列で応答すると、yファイルは削除されます。

関連:

おすすめ記事