web-dev-qa-db-ja.com

すべてのディレクトリ内に再帰的にフォルダ「Photo」を作成します

たくさんのフォルダーがあり、それらすべてのフォルダーをループし、各フォルダーに「Photo」という名前の別のフォルダーを作成したい

F1
--F11
----F111
----F112
--F12

私が欲しい:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
9
OOzy Pal

F1のすぐ上のディレクトリから次のスクリプトを実行します。

スクリプトの目的は、写真ディレクトリの下に冗長な写真ディレクトリを作成しないようにすることです。

また、ユーザーのルートディレクトリなどの間違った場所から誤って実行されるのを防ぐための設計ですが、F1ディレクトリが表示されず、間違った宮殿に誤って数百の写真ディレクトリが作成されます。

また、ユーザーがスクリプトをカスタマイズできるように、簡単にフォローできるスクリプトを作成することが私の意図でした。

#!/bin/bash

while IFS= read -r -d '' i;
do
    if [[ ! -d $i/Photo ]]; then
        # Filter to skip folders named Photo
        thisfolder="$(echo $i | sed "s/.*\///")"
        if [[ ! $thisfolder == "Photo" ]]; then
            mkdir "$i/Photo"
        fi
    fi
done < <(find F1 -type d -print0)

スクリプト更新:

  • pの小文字photoを大文字に変更しました。
  • 非スタンダーファイル名のサポートが追加されました(Terdonからの提案があります)。
8
L. D. James

単一のfind呼び出しを使用して実現できます。

find . -name 'Photo' -Prune -o -type d -exec mkdir {}/Photo \;

-name 'Photo' -Prune -o部分は、既存の(および新しく作成された)Photoディレクトリに再帰しないことを示します。見つかったファイル(またはディレクトリ)の名前がPhotoの場合、処理を停止します(-Prune)。それ以外の場合(-o)、ディレクトリ(-type d)に進み、コマンドを実行(-exec)します。

24
Melebius

findの結果をwhileの代わりにforに渡すことができます。この方法では、ファイル名にスペースが含まれていても壊れないからです。

最初にF1ディレクトリにcdし、次に実行します:

find -type d | while read dir ; do mkdir "$dir"/Photo ; done

ディレクトリが存在する場合、mkdirは作成を拒否するだけなので、問題ありません...

ディレクトリ名に改行やその他の異様な奇妙さが含まれている可能性がある場合は、任意の名前を処理できるこれを使用します。

find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done

これを支援してくれた@terdonに感謝します:)

9
Zanna

os.walkを備えたPythonは、ほんの数行のコードでかなり簡単に実行できます。

$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'                 
$ tree
.
├── dir_one
│   └── Pictures
├── dir_two
│   ├── dir_three
│   │   └── Pictures
│   └── Pictures
└── Pictures

説明

私たちが扱っているのは次のコマンドです:python -c 'import os; [os.mkdir(r + "/ Pictures")for r、d、f in os.walk( "。") ] '

ここでは、pythonインタープリターを-cフラグで呼び出して、単一引用符で囲んだコマンドを指定します。 os.walk()関数を使用すると、すべてのサブディレクトリを再帰的にステップスルーでき、サブディレクトリ(rで表される)ごとに、os.mkdir()関数を介してPicturesフォルダーを作成します。 r+"/Pictures"は、サブディレクトリ文字列と「/ Pictures」文字列を結合して1つのパスを形成する単純な文字列操作です

要件に合わせて「/ Pictures」を「/ Photo」に置き換えます

5

Bashを使用している場合は、単に次を実行できます。

shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done

globstarオプションは、**を「すべてのファイルと0個以上のディレクトリとサブディレクトリ」に一致させます。つまり、すべてを再帰的に一致させます。最後に/があるため、**/はすべてのディレクトリとサブディレクトリ(ファイルなし)に一致します。したがって、$dは現在のディレクトリとそのサブディレクトリ内のすべてのディレクトリを反復処理し、それぞれのディレクトリにPhotosディレクトリが作成されます。

mkdir-pフラグは以下を意味します。

  -p, --parents
          no error if existing, make parent directories as needed

ここでは、ターゲットディレクトリが既に存在する場合にエラーメッセージを抑制するために使用しています。エラーを表示する場合は削除してください。

これは、Photoという名前のfileを含むターゲットディレクトリにPhotoサブディレクトリを作成できないことに注意してください。ただし、これらの場合に何をすべきかを指定しておらず、これまでに投稿された他のすべての回答にもこの制限があります。

5
terdon