回答:
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
。ls
は解析されません。これはユーザーへのフィードバックにすぎません...何が起こっているかを示しています。「これは写真のディレクトリです」という言葉と同じです。そこにディレクトリが作成されない理由をユーザーに知らせています。
find -type d F1
、 多分?
$i/Photo
が、OPはそのような場合に何をすべきかを指定していません。また、$i
sの1つに改行が含まれている、確かにありそうもないケースでも失敗します。
1回のfind
呼び出しで実現できます。
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
この部分-name 'Photo' -prune -o
は、既存の(および新しく作成された)Photo
ディレクトリーに再帰しないように指示します。見つかったファイル(またはディレクトリー)の名前がのPhoto
場合は、その処理を停止します(-prune
)。それ以外の場合(-o
)は、ディレクトリを続け-type d
(-exec
)、コマンドを実行()します。
-prune
?:)はい、それはかなり直感に反していますが、学ぶ価値があります。
-type d
一緒に指定することでこれを変更できます。-name 'Photo'
-prune
find
、他のフォルダー(そのフォルダーのサブフォルダーを含め、必要な場合)を続行します。
の代わりに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に感謝します:)
F1
ディレクトリがの場合、~user/Pictures
親ディレクトリに移動して行を実行するとPhoto
、彼のスペース内のすべてのディレクトリにディレクトリが配置されます。F1
簡単に間違いを犯さないように、コマンドラインの一部としてを追加することを検討してください。そうすれば、誤って間違った場所から実行されても、ディレクトリは作成されません。
F1
代わりに、@ LDJames から編集することをお勧めします
Pythonはos.walk
かなり簡単に、数行のコードでそれを行うことができます
$ 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( "。")]'
ここでは、-c
フラグを指定してpythonインタープリターを呼び出し、単一引用符で囲んだコマンドを指定しています。os.walk()
関数を使用すると、すべてのサブディレクトリを再帰的にたどることができます。各サブディレクトリ(で表されますr
)に対して、次のようにしてピクチャフォルダを作成します。os.mkdir()
関数ます。r+"/Pictures"
サブディレクトリ文字列と "/ Pictures"文字列を結合して1つのパスを形成する単純な文字列操作です
「/ Pictures」を「/ Photo」に置き換えて、要件に合わせます
bashを使用している場合は、次のコマンドを実行するだけです。
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
このglobstar
オプションは、**
「すべてのファイルと0個以上のディレクトリとサブディレクトリ」を一致させます。つまり、すべてを再帰的に照合します。/
最後に**/
があるため、すべてのディレクトリとサブディレクトリに一致します(ファイルなし)。したがって、は$d
現在のディレクトリとそのサブディレクトリ内のすべてのディレクトリを反復処理し、それぞれにディレクトリPhotos
が作成されます。
-p
旗mkdir
手段:
-p, --parents
no error if existing, make parent directories as needed
ここでは、ターゲットディレクトリが既に存在する場合に、エラーメッセージを抑制するために使用しています。エラーを見たい場合は削除してください。
これPhoto
は、Photoという名前のファイルを含むターゲットディレクトリにサブディレクトリを作成できないことに注意してください。それらの場合に何をすべきかを指定していませんが、これまでに投稿された他のすべての回答にもこの制限があります。