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 F1
directory 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:
p
in photo
maiuscolo.ls
non 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 $i
s contiene una nuova riga.
Puoi raggiungerlo usando una sola find
chiamata.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
La parte -name 'Photo' -prune -o
dice di non ricorrere alle Photo
directory 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 d
insieme con -name 'Photo'
prima -prune
.
find
continuerà con altre cartelle (comprese le sottocartelle di quella cartella, se lo stai chiedendo).
È possibile passare i find
risultati a while
anziché invece in for
questo 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, mkdir
rifiuterà 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 :)
F1
directory dell'operazione è ~user/Pictures
, spostandosi nella directory padre ed eseguendo la riga, verrà inserita una Photo
directory in ogni directory nel suo spazio, che potrebbe essere migliaia. Prendi in considerazione l'aggiunta di F1
come 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.walk
può 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 -c
flag 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' globstar
opzione 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, $d
eseguirà l'iterazione su tutte le directory nella directory corrente e le relative sottodirectory e la Photos
directory verrà creata in ciascuna di esse.
La -p
bandiera dei mkdir
mezzi:
-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 Photo
sottodirectory 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.