
フォルダーのセットと*.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
しかし、もっと簡単な解決策があるはずだと感じています (エレガントなワンライナー? ファイルを作成せずに? ...?)。 私の考えは正しいでしょうか?
答え1
を使用している場合は、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
これは埋め込まれたスペースを含むファイル名を処理しますが、ソリューションではそれが処理されないことに注意してください。
他のシェルでも同様のテクニックを使用できますが、それについては説明できません。