
名前に「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
)