Gitに移行する前にCVSリポジトリをクリーンアップしています。準備の一環として、Attic
フォルダのみを含むフォルダを見つけて削除する必要があります。
私のunix-fuは強力ではありませんが、これは私が試したものであり、うまくいきませんが、うまくいけば意図が伝わることを願っています。
shopt -s globstar
for file in **/*
do
if [ -d "$file" ];then
if [`ls | wc -l` == 1 && `ls Attic | wc -l` == 1]; then
((echo Attic-only folder))
fi
fi
done
2番目の部分は、空のフォルダ(またはフォルダチェーン)を見つけることです。
たとえば、/foo/bar/Attic
削除され/foo/bar
、すべてが空の場合、ツリーの対応する部分も終了します。
背景:Gitに移行するためにCVSリポジトリをクリーンアップしようとしています。 CVSはAttic
削除されたファイル用のフォルダを作成します。過去10年間でいくつかの悪いことが起こりました。私はリスクと影響を完全に理解しています。データをバックアップしてコピーを作成しています。
ベストアンサー1
AND bash
、GNU find
AND comm
:
comm -12 \
<( find /path/to/CVS/repo -printf '%h\n' \
sort | uniq -u ) \
<( find /path/to/CVS/repo -name Attic -type d -printf '%h\n' | \
sort )
最初のs()は、find
リポジトリのすべての内容、ファイル、およびディレクトリを印刷します basename
。次に、子、ファイル、またはディレクトリが1つしかないディレクトリを印刷します。-printf '%h\n'
sort | uniq -u
次に2番目はfind
ディレクトリbasename
のsを印刷しますAttic
。このセットと上記のセット(例comm -12
)の交点は、まさにサブエントリのみを持つディレクトリですAttic
。
もちろん、これはシンボリックリンクやその他の面白いもの、改行文字を含むファイル名も無視します。いずれにせよ、CVSリポジトリに入れないでください。