Risposte:
Dalla directory appena sopra F1 esegui questo script:
Lo scopo dello script è quello di evitare la creazione di directory fotografiche ridondanti in directory fotografiche.
Inoltre, è progettato per impedire l'esecuzione accidentale da una posizione errata come la directory principale dell'utente, mentre non vedrebbe la F1directory e creerebbe erroneamente centinaia di directory fotografiche nei palazzi sbagliati.
Inoltre, era mia intenzione fare uno script facile da seguire in modo che l'utente potesse personalizzarlo.
#!/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)
Script aggiornato:
pin photomaiuscolo.lsnon viene analizzato. È solo un feedback per l'utente ... che mostra cosa sta succedendo. Proprio come le parole "Questa è una directory di foto". Sta facendo sapere all'utente perché non sta creando una directory lì.
find -type d F1, può essere?
$i/Photo, ma l'OP non ha specificato cosa fare in tal caso. Fallirà anche nel caso, certamente improbabile, in cui una delle $is contiene una nuova riga.
Puoi raggiungerlo usando una sola findchiamata.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
La parte -name 'Photo' -prune -odice di non ricorrere alle Photodirectory esistenti (e appena create) : se il file (o la directory) trovato ha il nome Photo, interrompere l'elaborazione ( -prune). Nell'altro caso ( -o), continua con directories ( -type d) ed esegui ( -exec) il comando.
-prune? :) Sì, è abbastanza intuitivo ma vale la pena imparare.
-type dinsieme con -name 'Photo'prima -prune.
findcontinuerà con altre cartelle (comprese le sottocartelle di quella cartella, se lo stai chiedendo).
È possibile passare i findrisultati a whileanziché invece in forquesto modo non si romperà se i nomi dei file hanno spazi
Prima cd nella directory F1, quindi fare:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
Se la directory esiste, mkdirrifiuterà semplicemente di crearla, quindi nessun problema lì ...
Se i nomi delle tue directory potrebbero contenere newline o altre stranezze esotiche, usa questo che può gestire nomi arbitrari:
find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
Grazie a @terdon per l'aiuto in questo :)
F1directory dell'operazione è ~user/Pictures, spostandosi nella directory padre ed eseguendo la riga, verrà inserita una Photodirectory in ogni directory nel suo spazio, che potrebbe essere migliaia. Prendi in considerazione l'aggiunta di F1come parte della linea di condotta per evitare un errore facilmente commesso. In questo modo, se viene eseguito inavvertitamente da un posto sbagliato, non creerà directory.
F1, a cura di @LDJames
Python con os.walkpuò farlo abbastanza facilmente e in poche righe di codice
$ 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
Ciò di cui abbiamo a che fare è questo comando: python -c 'import os; [os.mkdir (r + "/ Pictures") per r, d, f in os.walk (".")]'
Qui chiamiamo semplicemente l'interprete di Python con -cflag per specificare il comando che diamo tra virgolette singole. os.walk()La funzione ci consente di scorrere in modo ricorsivo tutte le sottodirectory e per ciascuna sottodirectory (rappresentata da r), creiamo la cartella Pictures tramite la os.mkdir()funzione. r+"/Pictures"è solo una semplice manipolazione di stringhe per unire stringhe di sottodirectory e stringhe "/ Pictures" per formare un percorso
Sostituisci "/ Immagini" con "/ Foto" per soddisfare le tue esigenze
Se stai usando bash, puoi semplicemente eseguire:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
L' globstaropzione fa **corrispondere "tutti i file e 0 o più directory e sottodirectory". In altre parole, corrisponde a tutto in modo ricorsivo. A causa della /fine, **/corrisponderà a tutte le directory e le sottodirectory (nessun file). Pertanto, $deseguirà l'iterazione su tutte le directory nella directory corrente e le relative sottodirectory e la Photosdirectory verrà creata in ciascuna di esse.
La -pbandiera dei mkdirmezzi:
-p, --parents
no error if existing, make parent directories as needed
Qui, lo sto solo usando per sopprimere i messaggi di errore se la directory di destinazione esiste già. Rimuovilo se vuoi vedere gli errori.
Si noti che ciò non riuscirà a creare una Photosottodirectory in una directory di destinazione che contiene un file denominato Photo. Tuttavia, non hai specificato cosa fare in quei casi e tutte le altre risposte postate finora hanno questa limitazione.