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リポジトリに入れないでください。
答え2
bashで兄弟がいないすべてのAttic
フォルダを見つけます.
。
find . -type d -name Attic -print0 | while read -d $'\0' DIR ;\
do [[ $(ls -1 "$DIR/.." | wc -l) -eq 1 ]] && echo "$DIR" ; done
echo
好みのファイル処理コマンドに置き換えてください;-)。
答え3
最初の部分はいくつかのPythonで行うのが最も簡単なようです。
#!/usr/bin/env python
import os, sys
for topdir in sys.argv:
for root, dirs, files in os.walk(topdir):
if not files and len(dirs) == 1 and dirs[0] == 'Attic':
print os.path.join(root)
次のように実行します。
./script.py /path/to/CVS/repo
ファイル名に改行文字が含まれておらず、協力xargs
(たとえば、-d
オプションがあるファイル) があると想定してディレクトリを削除するには、次の手順を実行します。
./script.py /path/to/CVS/repo | xargs -d '\n' rm -rf
それでも機能しない場合は、xargs
スクリプトを変更してNUL
終了文字列を印刷できます。
#!/usr/bin/env python
from __future__ import print_function
import os, sys
for topdir in sys.argv:
for root, dirs, files in os.walk(topdir):
if not files and len(dirs) == 1 and dirs[0] == 'Attic':
print(os.path.join(root), end="\0")
xargs -0
その後、次のようにディレクトリを終了できます。
./script.py /path/to/CVS/repo | xargs -0 rm -rf
後で空のディレクトリを殺すには:
find /path/to/CVS/repo -depth -type d -empty -delete
答え4
このコマンドを試してください。
find $(find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | awk '$NF==1{print $1}') -name Attic -exec rm -r {} \;