2016-07-24 19 views
2

Ich möchte alles in einem Ordner löschen, einschließlich Ordner, mit Ausnahme von zwei Dateien. Um dies zu tun, warum mit diesem Skript:Alles löschen, bis auf zwei Dateien

#!/usr/bin/env bash 

shopt -s extglob 
rm !(file1|file2) 

Welche funktioniert, aber wenn ich versuche, in einem Fall auszuführen:

#!/usr/bin/env bash 

read -r -p "Do you want remove everything \ 
[y/N]: " response 
case $response in 
    [yY][eE][sS]|[yY]) 
     shopt -s extglob 
     rm !(file1|file2) 
     ;; 
    *) 
     printf "Aborting" 
     ;; 
esac 

Dies wird geschehen:

test.sh: line 9: syntax error near unexpected token `(' 
test.sh: line 9: `rm !(file1|file2)' 

Ich möchte zu wissen, warum dies und noch wichtiger, wie zu beheben :)

+0

Ersetzen Sie Ihre erste Zeile durch den vollständigen Pfad zu binh binary und verwenden Sie die Option '-i', z. '#!/bin/bash -i' – Cyrus

Antwort

2

Keep shopt zu Beginn des Skripts:

#!/usr/bin/env bash 

shopt -s extglob 
read -r -p "Do you want remove everything [y/N]: " response 

case $response in 
    [yY][eE][sS]|[yY]) 
     echo rm !(list.txt|file2) 
     ;; 
    *) 
     printf "Aborting" 
     ;; 
esac 
+1

Können Sie erklären warum? –

+1

Das Ändern von 'shopt' funktioniert nicht innerhalb der' case' Anweisung. Es funktioniert nur, wenn es kurz vor 'case' platziert wird. – anubhava

1

Sie können es auf diese einfache Weise tun.

#!/usr/bin/env bash 

# Here you can insert the confirmation part. 

f1=file1 
f2=file2 

mv "$f1" "/tmp/${f1}$$" #move f1 to /tmp 
mv "$f2" "/tmp/${f2}$$" #move f2 to /tmp 

rm -r ./* #remove everything there is. -r means recursive. 

mv "/tmp/${f1}$$" "${f1}" #move f1 and f2 back 
mv "/tmp/${f2}$$" "${f2}" 

Es ist sehr einfach, so dass das Skript aus dem betreffenden Verzeichnis ausgeführt werden muss.

+0

Gute Sachen. Vielen Dank. – tomasz