Creare una cartella "Foto" all'interno di tutte le directory in modo ricorsivo


9

Ho un sacco di cartelle e voglio scorrere su tutte quelle cartelle e in ogni cartella creare un'altra cartella denominata "Foto"

F1
--F11
----F111
----F112
--F12

Voglio avere:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo

Risposte:


8

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:

  • Modificato il minuscolo pin photomaiuscolo.
  • Aggiunto supporto per nomi di file non stander (con suggerimenti di Terdon).

1
Eviterei sicuramente di analizzare ls , potrebbe fallire in modi insoliti. Penso che le risposte che evitino questo siano probabilmente più sicure.
Arronical

3
@Arronical 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ì.
LD James,

1
Avevo pensato che potesse essere il caso, dato che non riuscivo a vedere nulla di fatto. In tal caso, ritiro il mio commento e
declinerò

find -type d F1, può essere?
Olivier Grégoire,

Notare che ciò fallirà se viene chiamato un file (e non una directory) $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.
terdon,

24

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.


ah bello, l'ho provato in quel modo e vedo dalla tua risposta dove stavo sbagliando :)
Zanna

@Zanna -prune? :) Sì, è abbastanza intuitivo ma vale la pena imparare.
Melebio

Smetterà di creare una cartella 'Foto' se esiste un file chiamato 'Foto'?
Anwar,

3
@Anwar La versione attuale lo farà. C'è una zona grigia nei requisiti. :) Puoi cambiarlo specificando -type dinsieme con -name 'Photo'prima -prune.
Melebio

2
@Anwar Al secondo sguardo, non ha senso. Non è possibile creare una cartella con lo stesso nome di un file normale all'interno della stessa cartella. E findcontinuerà con altre cartelle (comprese le sottocartelle di quella cartella, se lo stai chiedendo).
Melebio

9

È 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 :)


Se la 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.
LD James,

ah sì, in realtà non ero sicuro della loro struttura di directory. Suggerisco invece di farlo F1, a cura di @LDJames
Zanna

5

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

Spiegazione

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


4

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.