2017-11-17 11 views
1

以下のコマンドを実行して、小文字のファイル/ディレクトリに置き換えます。 _などさまざまな操作が可能です。問題は、ディレクトリの名前を最初に変更しようとしているように見えて、そのディレクトリの下にあるファイルが見つからないということです。ディレクトリ内のすべてのファイルの名前を変更してから、ディレクトリ自体を再帰的に変更する方法はありますか?例えばディレクトリ名前にファイル名を変更する

  • directory1の
    • FILE1
    • FILE2
    • directory1の
      • FILE1
      • FILE2
    • directory2
      • file1の
  • directory2
    • file1の
    • FILE2

私のコードは

ですここ
while IFS= read -rd '' entry; do 
    entry="${entry#./}"   # strip ./ 
    if [[ -d $entry ]]; then 
     rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry" 
    else 
     rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry" 
    fi 
done < <(find . -iname '*' -print0) 
+0

これを達成するには、再帰を使うか、ファイル名を最初に変更してからディレクトリ – dganesh2002

+1

を使う必要があります。リストを作成してディレクトリ/ファイルの深度については 'find'を使用します。 – yacc

答えて

0

再帰を使用して、サンプルテストされていないコードです:

recurse() 
{ 
for entry in "$1"/*; do 
    entry="${entry#./}"   # strip ./ 
    if [[ -d $entry ]]; then 
     recurse $entry 
     rename 'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry" 
    else 
     rename 'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry" 
    fi 
done 
} 

recurse "/home" 
0

は、あなたがあなたのシナリオはより複雑であるが、それらは再帰の点では同じ困難を扱ったように見えるthis answer? を見てきました。

私はこの線に沿って何かを考えていた
0

find /path |awk -F/ '{print NF,$0}' |sort -r -n -k 1 |cut -f2- -d' ' |\ 
    while IFS= read -rd '' entry; do 
    # ... 
    done 

アイデアは/の数とそれぞれの行を付加することで、ソート逆この分野に応じて:

4 /パス/ DIR1/FILE1
4 /パス/ DIR2/FILE2
3 /経路/ DIR1
3 /経路/ DIR2
2 /パットh

次に、最初の列を切り取ります。こうすることで、問題の名前を変更しないようにエントリのボトムアップを行うことができます。

+0

これはうまくいくようですが、ファイル/ディレクトリを処理しようとすると 'Filename too long:'というエラーが表示されます。私はWindows(Ubuntu)用のbashを使用していて、NTFSディスク上でコマンドを実行していると追加するかもしれません。 –

+0

どこから来ているのでしょうか? – yacc

+0

いや私はこれを実行すれば、それはうまく動作すると思います。 | awk -F/'{print NF、$ 0}' | sort -r -n -k 1 | cut -f2- -d '' | \ entry = "$ {entry#。/}"#strip ./ if [[-d $ entry]];その後、 エコー$エントリ 他 エコー$エントリ Fiを は、あなたが 'dirname'と' 'dirnameは= $(dirnameは "$エントリ")のようなbasename''、そして 'のpushd "の$ DIRNAME" のエントリを分割することができ –

関連する問題