シェルスクリプト:同じ名前のフォルダーが存在しない場合にファイルを削除する


0

一連のフォルダーと一連の*.DATファイルがあります。同じ名前(なし)のフォルダーが存在しない場合
*.DATファイルを削除します.DAT
このソリューションに到達するまでに時間がかかりました。

find . -type d > dirs.txt
for F in `find *.DAT`
do
  F=$(sed 's|\.DAT||g' <<< $F)
  if grep "$F" dirs.txt; then
    echo "$F found"
  else
    rm $F.DAT
  fi
done

しかし、はるかに簡単な解決策があるはずだと思います(エレガントなワンライナー?ファイルを作成せずに...?)。私は正しいですか?


通常、フォルダは.DATファイルのすぐ横にありますか、それとも散在していますか?
-grawity

@grawity:フォルダーと.DATファイルは同じフォルダーにあります。
マイク

回答:


2

を使用sedしている.DAT場合は、を削除するために使用する必要はありません。サブシェルと外部プログラムを使用しなくてもbash、組み込みのパラメーター展開${F%.DAT}により同じことが実現します。

ディレクトリが.DATファイルに対して任意の場所にある場合、ディレクトリリストファイルはそれを解決する最も効率的な方法ですが、両方が同じ場所にある場合、はるかに簡単な答えは次のとおりです。

find *.DAT | while read -r f; do if [ -d "${f%.DAT}" ]; then echo "${f%.DAT}" found; else rm "$f"; fi; done

これは、スペースが埋め込まれたファイル名を処理しますが、ソリューションでは処理できないことに注意してください。

他のシェルについても、同様の手法を使用できますが、代弁することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.