Crea softlink su un file in ogni sottocartella


2

Ho qualche spazio web su cui non posso modificare il main php.ini file, e non posso usare un .htaccess comando per renderlo applicato ricorsivamente.

Se chiamiamo la mia directory web D, Mi piacerebbe creare ricorsivamente un collegamento software in ogni sottodirectory di D (e ogni sottodirectory sotto quelle, ecc.) a a php.ini file in D.

C'è una singola istruzione da riga di comando che potrebbe essere utilizzata per questo? Se è così, che cosa è?

Sto usando un host basato su Linux.

Risposte:


3

Soluzione Bash 4+ (con globstar abilitato, ** è un glob ricorsivo e **/ si espanderà in ogni directory, in modo ricorsivo):

shopt -s globstar
for f in ./**/; do ln -s php.ini "$f"php.ini; done

Soluzione POSIX con find - funziona su qualsiasi * nix:

find . -type d -exec ln -s php.ini '{}'/php.ini \;

Uno di questi dovrebbe essere eseguito nella directory D. ln -s è il comando per creare un collegamento simbolico (soft) su * nix, puoi controllare ulteriori informazioni su di esso con man ln.

Per rimuovere i collegamenti in seguito, è possibile utilizzare nuovamente bash (supponendo versione 4+) o trovare:

shopt -s globstar
for f in ./**/php.ini; do [[ -L "$f" ]] && rm "$f"; done

Il [[ -L "$f" ]] verifica se $ f è un collegamento software e && significa 'fare la cosa successiva solo se la precedente valuta il valore vero' - quindi questo non eliminerà il tuo file 'php.ini' originale.

find . -type l -name 'php.ini' -delete

-type l (che è una L minuscola, non una) dice a find di cercare solo collegamenti simbolici (soft), il che significa che non troverà & amp; cancella il tuo file 'php.ini' originale.


Grazie! Questo crea i collegamenti ... (sfortunatamente, devo tornare al tavolo da disegno su come sto per affrontare il problema originale) Se voglio rimuoverli in seguito, potrei far apparire la globstar: for f in ./**/; do rm php.ini; done Destra?
apnorton

for f in ./**/; do rm "$f"php.ini; done, in realtà (la tua ipotesi rimuoverà solo il file php.ini originale, non uno qualsiasi dei soft link). O, ancora meglio: rm ./**/php.ini. Entrambi rimuoveranno l'originale php.ini anche, però; il modo più semplice è quello di rinominare l'originale prima con qualcosa di simile mv php.ini php.ini.backupe quindi rinominarlo quando hai terminato di eliminare i collegamenti. È possibile evitare la soluzione alternativa di ridenominazione utilizzando find . -mindepth 2 -type f -name 'php.ini' -delete - vedi man find per maggiori informazioni.
evilsoup

1
D'oh, brainfart: troveresti file regolari e non collegamenti simbolici; invece dovresti usare find . -type l -name 'php.ini' -delete (Questo è un L minuscolo, non un 1).
evilsoup
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.