Jawaban:
Dari direktori tepat di atas F1 jalankan skrip ini:
Tujuan dari skrip ini adalah untuk menghindari pembuatan direktori foto yang berlebihan di bawah direktori foto.
Juga, ini dirancang untuk mencegahnya menjalankannya secara tidak sengaja dari lokasi yang salah seperti direktori root pengguna, sedangkan direktori tersebut tidak akan melihat F1
direktori dan secara keliru membuat ratusan direktori foto di istana yang salah.
Selain itu, niat saya adalah membuat skrip yang mudah diikuti sehingga pengguna dapat menyesuaikannya.
#!/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)
Skrip Diperbarui:
p
dalam photo
kasus atas.ls
tidak diuraikan. Ini hanya umpan balik kepada pengguna ... yang menunjukkan apa yang terjadi. Sama seperti kata-kata "Ini adalah direktori foto". Ini memberi tahu pengguna mengapa tidak membuat direktori di sana.
find -type d F1
, mungkin?
$i/Photo
, tetapi OP belum menentukan apa yang harus dilakukan dalam kasus seperti itu. Ini juga akan gagal dalam, kasus tidak diakui, di mana salah satu dari $i
s berisi baris baru.
Anda dapat mencapainya menggunakan satu find
panggilan.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
Bagian -name 'Photo' -prune -o
memberitahu untuk tidak berulang ke Photo
direktori yang ada (dan baru dibuat) : Jika file yang ditemukan (atau direktori) memiliki nama Photo
, berhenti memprosesnya ( -prune
). Dalam kasus lain ( -o
), lanjutkan dengan direktori ( -type d
) dan jalankan ( -exec
) perintah.
-prune
? :) Ya, ini cukup kontra-intuitif tetapi layak dipelajari.
-type d
bersama-sama dengan -name 'Photo'
sebelum -prune
.
find
akan melanjutkan dengan folder lain (termasuk subfolder dari folder itu, jika Anda memintanya).
Anda dapat meneruskan find
hasil while
alih-alih for
karena cara ini tidak akan rusak jika nama file memiliki spasi
Pertama cd ke direktori F1
, lalu lakukan:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
Jika direktori ada, mkdir
hanya akan menolak untuk membuatnya, jadi tidak ada masalah di sana ...
Jika nama direktori Anda bisa berisi baris baru, atau keanehan eksotis lainnya, gunakan ini yang bisa berurusan dengan nama arbitrer:
find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
Terima kasih kepada @terdon untuk bantuannya :)
F1
direktori op adalah ~user/Pictures
, pindah ke direktori induk dan menjalankan baris akan meletakkan Photo
direktori di setiap direktori di ruangnya, yang bisa ribuan. Pertimbangkan untuk menambahkan F1
sebagai bagian dari commanline untuk menghindari kesalahan yang mudah dilakukan. Dengan begitu jika secara tidak sengaja dijalankan dari tempat yang salah, itu tidak akan membuat direktori.
F1
diedit @LDJames
Python with os.walk
dapat melakukannya dengan cukup mudah dan hanya dalam beberapa baris kode
$ 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
Apa yang kita hadapi adalah perintah ini: python -c 'import os; [os.mkdir (r + "/ Pictures") untuk r, d, f di os.walk (".")]'
Di sini kita cukup memanggil penerjemah python dengan -c
flag untuk menentukan perintah yang kita berikan dalam tanda kutip tunggal. os.walk()
fungsi memungkinkan kita untuk melangkah secara rekursif melalui semua subdirektori, dan untuk setiap subdirektori (diwakili oleh r
), kita membuat folder Pictures melalui os.mkdir()
fungsi. r+"/Pictures"
hanyalah manipulasi string sederhana untuk bergabung dengan string subdirektori dan string "/ Gambar" bersama untuk membentuk satu jalur
Ganti "/ Gambar" dengan "/ Foto" agar sesuai dengan kebutuhan Anda
Jika Anda menggunakan bash, Anda cukup menjalankan:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
The globstar
merek pilihan **
cocok "semua file dan 0 atau lebih direktori dan subdirektori". Dengan kata lain, itu cocok dengan semuanya secara rekursif. Karena /
pada akhirnya, **/
akan cocok dengan semua direktori dan subdirektori (tidak ada file). Oleh karena itu, $d
akan mengulangi semua direktori di direktori saat ini dan subdirektori dan Photos
direktori akan dibuat di masing-masing direktori.
The -p
Bendera mkdir
berarti:
-p, --parents
no error if existing, make parent directories as needed
Di sini, saya hanya menggunakannya untuk menekan pesan kesalahan jika direktori target sudah ada. Hapus jika Anda ingin melihat kesalahan.
Perhatikan bahwa ini akan gagal membuat Photo
subdirektori dalam direktori target yang berisi file bernama Foto. Anda belum menentukan apa yang harus dilakukan dalam kasus-kasus itu dan semua jawaban lain yang diposting sejauh ini juga memiliki batasan ini.