
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
-exec
rm -i
これはそれぞれの簡単な例を示しており、$searchpath
検索パスは次$pattern
のとおりです。決定的な名前パターン(例"*$1*"
:)。
-ok
:を使用すると同様の-ok
操作が実行されますが、指定されたユーティリティを実行する前にまずユーザーの確認を要求します。これを使用して、見つかった各パス名を個別に実行します。find
-exec
rm
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
ファイルは削除されます。
関連:
答え2
pattern=$1
dir=$2
for file in $(find ${dir} -type f -name "*${pattern}*")
do
/bin/rm -i ${file}
done
デフォルトでは、コマンドによって返されたファイルが繰り返されており、find
コマンドrm -i
はy/n
ファイルを削除するかどうかを尋ねます。これがあなたが探しているものだと思います。しかし、そうでない場合は、さらに助けが必要なものである人に教えてください。