Può accedere alle directory usando ls ma non da Bash


0

Ho un sacco di utenti indisciplinati con account di posta su un mio server. Non svuotano mai le loro cartelle spazzatura o spazzatura e il numero di file sale all'infinito.

Sto creando uno script Bash per cancellare periodicamente quei file usando cron.

Ho fatto questo:

  1. creare un file txt con un elenco di directory che voglio cancellare;
  2. creare uno script che legga riga per riga, ogni directory e cancella tutto da cure new.

Esempio di file txt:

~/mail/.Junk/cur
~/mail/.Junk/new
~/mail/.Trash/cur
~/mail/. Trash/new
~/mail/.administrative@example.com/.Junk/cur
~/mail/.administrative@example.com/.Junk/new
~/mail/.administrative@example.com/.Trash/cur
~/mail/.administrative@example.com/.Trash/new
~/mail/.finance@example.com/.Junk/cur
~/mail/. finance@example.com/.Junk/new
~/mail/. finance@example.com/.Trash/cur
~/mail/. finance@example.com/.Trash/new

Sono nella prima fase della creazione dello script in cui collaudo se posso accedere alle directory ed elencarne i contenuti.

Quindi ho questo script:

#!/bin/bash 

while read line 
do 
ls $line
done < ~/directories.txt 

Quando eseguo lo script viene visualizzato il seguente errore:

ls: impossibile accedere a ~/mail/.administrative@example.com/.Junk/new/: nessun file o directory

per tutte le directory ma se scrivo

ls ~/mail/.administrative@example.com/.Junk/new/

funziona benissimo.

perché?


Chron esegue lo script sotto root, quindi ~punta a una directory home diversa (probabilmente /root). usa percorsi completi e assicurati che root abbia accesso alle cartelle e ai contenuti.
Frank Thomas,

Esegui lo script (o cron) con lo stesso utente di quello quando esegui "ls" manualmente? Prova a fare eco al ~percorso nella sceneggiatura per vedere se sei nel posto giusto e forse dovrai usare il percorso assoluto della tua casa invece del~
Flinth

Risposte:


3

Cita le tue variabili!

while read linee quindi fare ls $linenon funzionerà; devi usare ls "$line"per gestire gli spazi bianchi nelle variabili. In genere, cita le tue variabili quando le usi!

In caso contrario, stai provando ad avere un grosso problema quando provi a farlo rm $line, se quella linea lo è

~/mail/. Trash/new

Quindi, se lo facessi ls $line, proverebbe a elencare due cartelle:

  • ~/mail
  • Trash/new

Nel peggiore dei casi, se lo facessi rm -rf $line, rimuoveresti ~/mailcompletamente ! Quindi, usa ls "$line"all'interno del tuo loop. E lo stesso per rm.

In effetti, il modo più affidabile per leggere un file riga per riga e gestire correttamente gli spazi bianchi è spiegato qui :

while IFS= read -r line; do
    ls "$line"
done < "$file"

Le -rimpedisce barre rovesciate vengano espansi, e IFS=aiuta nel caso in cui una linea inizia o termina con uno spazio, che la shell assetto altrimenti.

Non utilizzare percorsi che devono essere espansi!

Se il tuo file di testo contiene percorsi che verranno espansi solo in seguito, il percorso cambierà a seconda di chi esegue lo script dove. Qui, ~verrà espanso nel percorso home dell'utente al momento dell'esecuzione, quindi se si esegue lo script come root, inizierà da /roote non dalla home dell'utente al momento della creazione del file di testo.

Pertanto, memorizzare i percorsi completi nel file.

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.