Windows batを用いたファイルの一括削除について
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 764
Windowsで以下のようなデータ削除用バッチを作成したのですが
一部のファイルが削除できず、困っています。
解決方法について、どなたかご教示いただけないでしょうか。
<概要>
処理の内容:
ファイル名に"_"を含むtxtファイルがあり、
ファイル名には果物名が含まれている。
特定の果物名が含まれるtxtファイルを一括削除したい。
具体的には、
①「in.csv」を"_"で区切り、削除対象の果物名を読み込む。
②削除対象ファイルが存在するフォルダのdirを取得する。
③dir結果を1行ずつ"_"で区切って果物名を抽出する。
④「in.csv」とdir結果の果物名が一致する場合、
絶対パス指定でファイルを削除する。
削除対象のファイル名(イメージ):
D:\~\~\~~~\A_BBB_CCC_DDD_EEE_F.txt
・果物名は"BBB"部分。
・"BBB"、"CCC"には"_"が含まれることがある。
・各ファイルは別々のフォルダに格納されている。
<困っていること>
・"BBB"、"CCC"にあたる箇所に"_"が含まれる場合、
dir結果、in.csvから果物名を抽出できない。
(処理抜粋)
set IN_CSV=in.csv
set IN_CSV_PATH=C:\~\~\~~~
REM in.csvから果物名を抽出
pushd %IN_CSV_PATH%
for /F "tokens=2 delims=_" %%n in (in.csv) do (
REM dummyline
)
REM work用カレント(C:\work)を変数に保持
for /F "usebackq" %%i in (cd
) do (
set WORK="%%i"
)
pushd D:\~\~\~~~
set FLAG=0
REM in.csvから果物名を抽出、ループ処理
REM dirで取得したファイル名に該当の果物名が含まれていれば削除
set FLAG2=0
REM 抽出
for /F "usebackq tokens=2 delims=_" %%n in (type %WORK%\%IN_CSV%
) do (
REM 発見したファイルごとに削除
for /F "usebackq tokens=1-10 delims=_" %%a in (dir /s /b
) do (
if %%~xf == .txt (
if %%n == %%b (
set FLAG2=1
del %%a_%%b_%%c_%%d_%%e_%%f
)
)
)
REM dirを1ループして一致しない場合はエラー
if !FLAG2! == 0 (
echo [!date! !time!] 「%%n」の該当ファイルは存在しませんでした
)
set FLAG2=0
)
==========================
(in.csv)
A_りんご
A_みかん
A_いちご
A_ばなな
A_キ_ウイ
A_キ_ウ_イ
※どこかで"_"の数を数えたり、変数(%%a~)の数を数えたり
といった処理を入れれば解決できそうなのですが…
以上、よろしくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
具体的なコードは割愛しますが、以下のように改善してみてはいかがでしょうか。
- in.csvから果物名を抽出する際、デリミタ
_
で分割するのではなく、3文字目以降を果物名とする(1項目目が1文字の前提) - 抽出した果物名でファイルを削除する際、
dir /s /b
の抽出結果を自力で判定するのではなく、dir /s /b *果物名*
で抽出したものを無条件で削除する - そもそも値にデリミタを含んでいるのがおかしいので、in.csvのフォーマットを見直す(csvの名の通りカンマ区切りにするなど)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/04/03 19:47
csvのフォーマットを見直したら読み込めるようになりました!
ただ、削除対象のファイルは絶対パス指定&拡張子指定かつ、
ファイル名の"(1文字)_"の直後に果物名が入っているもののみと
したいと考えています。
ワイルドカードだと絶対パス指定ができなかったような記憶があるので
もう少し色々試してみたいと思います!
ご回答いただき、本当にありがとうございました。
2018/04/03 20:47 編集
2018/04/03 21:28
そうなんです、絶対パスですと上手くワイルドカードで
指定できなかっため、dir結果から抽出した
削除対象のファイル名の一覧を別のcsvに格納して、
delの引数にすることで一括削除に成功しました!
(もっと効率のいいやり方があるかもしれませんが・・・)
お二方ともありがとうございましたm( . . )m