Ci sono vari possibili punti di errore nel tuo script. Prima di tutto, rm *.old*
utilizzerà globbing per creare un elenco di tutti i file corrispondenti e che può gestire nomi di file contenenti spazi bianchi. Il tuo script, tuttavia, assegna una variabile a ciascun risultato del glob e lo fa senza virgolette. Ciò si interromperà se i nomi dei file contengono spazi bianchi. Per esempio:
$ ls
'file name with spaces.old.txt' file.old.txt
$ rm *.old.* ## works: both files are deleted
$ touch "file.old.txt" "file name with spaces.old.txt"
$ for i in ./*; do oldfile=$i; rm -v $oldfile; done
rm: cannot remove './file': No such file or directory
rm: cannot remove 'name': No such file or directory
rm: cannot remove 'with': No such file or directory
rm: cannot remove 'spaces.old.txt': No such file or directory
removed './file.old.txt'
Come puoi vedere, il ciclo non è riuscito per il file con spazi nel suo nome. Per farlo correttamente, dovresti citare la variabile:
$ for i in ./*; do oldfile="$i"; rm -v "$oldfile"; done
removed './file name with spaces.old.txt'
removed './file.old.txt'
Lo stesso problema si applica praticamente a ogni uso del $i
tuo script. Dovresti sempre citare le tue variabili .
Il prossimo possibile problema è che ti aspetti che *.old.*
corrisponda ai file con l'estensione .old
. Non Corrisponde a "0 o più caratteri" ( *
), quindi a .
, quindi "vecchio", quindi un altro .
e poi "0 o più caratteri". Ciò significa che non corrisponderà a qualcosa di simile file.old
, ma solo a qualcosa come `file.old.foo:
$ ls
file.old file.old.foo
$ for i in *; do if [[ "$i" == *.old.* ]]; then echo $i; fi; done
file.old.foo
Quindi, nessun nemico file.old
. In ogni caso, la tua sceneggiatura è molto più complessa del necessario. Prova questo invece:
#!/bin/bash
for i in *; do
if [[ -f "$i" ]]; then
if [[ "$i" == *.old ]]; then
rm -v "$i" || echo "rm failed for $i"
else
echo "$i doesn't have an .old extension"
fi
cp -v "$i" "$i".old
else
echo "$i is not a file"
fi
done
Si noti che ho aggiunto -v
alle istruzioni rm
e cp which does the same thing as what you were doing with your
echo`.
Questo non è perfetto da quando, ad esempio, si trova file.old
che verrà rimosso e, in seguito, lo script proverà a copiarlo e fallirà poiché il file non esiste più. Tuttavia, non hai spiegato cosa sta effettivamente tentando di fare lo script, quindi non posso risolvere il problema per te a meno che tu non ci dica cosa stai veramente cercando di realizzare.
Se quello che vuoi è i) rimuovere tutti i file con l' .old
estensione e ii) aggiungere l' .old
estensione a tutti i file esistenti che non ce l'hanno, tutto ciò di cui hai veramente bisogno è:
#!/bin/bash
for i in *.old; do
if [[ -f "$i" ]]; then
rm -v "$i" || echo "rm failed for $i"
else
echo "$i is not a file"
fi
done
## All the ,old files have been removed at this point
## copy the rest
for i in *; do
if [[ -f "$i" ]]; then
## the -v makes cp report copied files
cp -v "$i" "$i".old
fi
done
rm *.old.*
che rimuove questi file ma non il file di backup file.old. Sto provando a farlo nella mia sceneggiatura. Grazie