Atticというサブフォルダのみを含むフォルダの一覧表示

Atticというサブフォルダのみを含むフォルダの一覧表示

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 findAND 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 {} \;

関連情報