8

次の構造を持つサブフォルダー (/...) を持つ多くのフォルダーを含むフォルダーがあります。

_30_photos/combined
_30_photos/singles
_47_foo.bar
_47_foo.bar/combined
_47_foo.bar/singles
_50_foobar

コマンドを使用すると、構造**find . -type d -print | grep '_[0-9]*_'を持つすべてのフォルダーが表示されます。しかし、 */combined フォルダーのみをキャプチャする正規表現を生成しました が、それを find コマンドに挿入すると、何も出力されません。_[0-9]*_[a-z.]+/combined

次のステップは、結合されたフォルダー (hdd のどこかに) ごとにフォルダーを作成し、結合されたフォルダーの内容を新しいフォルダーにコピーすることです。新しいフォルダー名は、サブフォルダーの親名と同じにする必要があります (例: _47_foo.bar)。検索後に xargs コマンドでそれを達成できますか?

4

4 に答える 4

9

grepは必要ありません:

find . -type d -regex ".*_[0-9]*_.*/combined"

残りの部分:

find . -type d -regex "^\./.*_[0-9]*_.*/combined" | \
   sed 's!\./\(.*\)/combined$!& /somewhere/\1!'   | \
   xargs -n2 cp -r
于 2012-08-22T13:38:42.290 に答える
4

基本では、次grepをエスケープする必要があります+

... | grep '_[0-9]*_[a-z.]\+/combined'

または、エスケープする必要のない「拡張正規表現」バージョン (egrepまたはgrep -E[thanks chepner]) を使用でき+ます。

xargs複数のコマンドで使用するのは難しいため、上記のコピーを行う最も柔軟な方法ではない場合があります。while ループを使用すると、柔軟性が向上する場合があります。

... | grep '_[0-9]*_[a-z.]\+/combined' | while read combined_dir; do 
    mkdir some_new_dir
    cp -r ${combined_dir} some_new_dir/
done

の名前を自動化する方法が必要な場合は、 bash 文字列操作をご覧くださいsome_new_dir

于 2012-08-22T13:36:24.710 に答える
0

次のコマンドを使用できます。

find . -type d | grep -P "_[0-9]*_[a-z.]+/combined"
于 2017-06-12T10:06:37.393 に答える