5

私は次のレイアウトを持っています:

  • d1
    • f1
    • f2
    • f3
  • d2
    • f4
    • f5
  • d3
    • f6
    • f7
    • f8
    • d4
      • f9

私がやりたいことは、ルートディレクトリの名前を変更して、含まれる(再帰的な)ファイルの数を含めることです。長すぎない限り、形式はそれほど重要ではありません。このスクリプトを 1 時間ごとに cron として実行してディレクトリ名を更新できるようにしたいので、最初の実行後は次のようになります。

  • 3-d1
    • f1
    • f2
    • f3
  • 2-d2
    • f4
    • f5
  • 4-d3
    • f6
    • f7
    • f8
    • d4
      • f9

次に、2 回目の実行後、さらにいくつかのファイルが追加および削除され、次のようになります。

  • 1-d1
    • f1
  • 4-d2
    • f2
    • f3
    • f4
    • f5
  • 10-d3
    • f6
    • f7
    • f8
    • d4
      • f9
      • f10
      • f11
      • f12
      • f13
      • f14
      • f15

これまでのところ、次のbashスクリプトがありますが、ファイル名の正規表現置換を行う方法がわかりません

#!/bin/bash

TARGETPATH=/home/pritchea/test
for CURDIR in `ls -l $TARGETPATH`
do
  if [ -d $TARGETPATH/$CURDIR ]; then
    echo "$CURDIR is a directory"
    FILECOUNT=`find $TARGETPATH/$CURDIR -type f | wc -l`
    echo " and there are $FILECOUNT file(s)";
  fi
done
4

2 に答える 2

3

.
├── d1
│   ├── f1
│   ├── f2
│   └── f3
├── d2
│   ├── f4
│   └── f5
└── d3
    ├── d4
    │   └── f9
    ├── f6
    ├── f7
    └── f8

最上位ディレクトリでコマンドを実行します

cd /home/pritchea/test

for i in *
do
    [[ -d $i ]] || continue
    n=${i#*-}
    c=$(find "$i" -type f -printf x | wc -c)
    [[ $i == $c-$n ]] && continue
    mv -f "$i" "$c-$n"
done

.
├── 2-d2
│   ├── f4
│   └── f5
├── 3-d1
│   ├── f1
│   ├── f2
│   └── f3
└── 4-d3
    ├── d4
    │   └── f9
    ├── f6
    ├── f7
    └── f8
于 2012-04-14T00:40:40.143 に答える
0

これが私がやった方法です。$TARGETPATHを使用して、内のすべてのディレクトリをループしls -l、各 内にディレクトリではないファイルがいくつ存在するかを確認します$CURDIR。注: これは最善の方法ではない可能性があります (find -fより良い結果が得られる可能性があります。シンボリックリンクなどで確認していません)。

ではなくwc -lに似た出力が得られる傾向があるため、 を使用して空白を取り除きます。[ 1][1]sed

存在する場合はディレクトリから番号を削除して、これを複数回再実行し、次のような名前にならないように2-3-dirnewdirnameますCURDIR。そうであれば、実行する意味はありませんmv


#!/bin/bash

TARGETPATH=.
for CURDIR in `ls -l $TARGETPATH`
do
  if [ -d $TARGETPATH/$CURDIR ]; then
    echo "$CURDIR is a directory"
    #Also strip whitespace from FILECOUNT
    FILECOUNT=$(ls -l $CURDIR | grep ^- | wc -l | sed -e 's/[ \t]*//')
    echo " and there are $FILECOUNT file(s)";

    # We should remove the number from the directory.
    newdirname="$FILECOUNT"-"$(echo "$CURDIR" | sed -e 's/^[0-9]*-//')"
    echo " New directory name: ["$newdirname"]"
    # Now we move the old-dir to the new-dir. 
    if [[ "$CURDIR" != "$newdirname" ]]; then
    mv $TARGETPATH/$CURDIR $TARGETPATH/$newdirname
    fi  
  fi  
done
于 2012-04-14T12:50:28.953 に答える