たくさんのフォルダーがあり、それらすべてのフォルダーをループし、各フォルダーに「Photo」という名前の別のフォルダーを作成したい
F1
--F11
----F111
----F112
--F12
私が欲しい:
F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
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
を大文字に変更しました。単一のfind
呼び出しを使用して実現できます。
find . -name 'Photo' -Prune -o -type d -exec mkdir {}/Photo \;
-name 'Photo' -Prune -o
部分は、既存の(および新しく作成された)Photo
ディレクトリに再帰しないことを示します。見つかったファイル(またはディレクトリ)の名前がPhoto
の場合、処理を停止します(-Prune
)。それ以外の場合(-o
)、ディレクトリ(-type d
)に進み、コマンドを実行(-exec
)します。
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に感謝します:)
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」に置き換えます
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
サブディレクトリを作成できないことに注意してください。ただし、これらの場合に何をすべきかを指定しておらず、これまでに投稿された他のすべての回答にもこの制限があります。