Odpowiedzi:
Bash rozszerzył globowanie (pierwszy test, a następnie usunięcie echa):
shopt -s extglob
echo rm -rf !(A)
shopt | grep extMożesz sprawdzić, czy wtyczka jest włączona.
Co powiesz na:
mv A /tmp/
rm * -rf
mv /tmp/A .
Pozwala to uniknąć „rzadkości” literówki w innych poleceniach.
Coś jak
find . -type d -not -name A -exec rm -ir {} \;
powinieneś zrobić.
edytować
Tak powinno być
find . -type d -maxdepth 1 -not -name A -exec rm -ir {} \;
aby zapobiec findod recursing poniżej A.
zwykle robię to, pracując nad poleceniem ls, które najpierw to robi. nie jestem na maszynie uniksowej, ale coś takiego:
ls -lda "[^ A]"
Po prawidłowym ustawieniu potok do polecenia
ls -lda "[^ A]" | xargs rm -rf
Jeśli powyższe wyrażenie regularne jest błędne, możesz je edytować powyżej ...
Oto jeden sposób. Uważaj jednak na tego rodzaju rzeczy, jest on tak potężny, że można go używać tylko dla dobra lub zła ...
znajdź * typ d | grep -v "^ A" | xargs rm -rf
Nie używaj find, ponieważ niektórzy ludzie pokazali z -exec i rm bez przekazywania -print0, aby znaleźć i -0 do xargs. Będzie mylić nazwy plików ze spacjami lub znakami nowej linii:
$ mkdir 'foo foo'
$ mkdir foo$'\n'foo
$ find . -type d -exec rm -ir {} \;
rm: cannot remove directory `.'
rm: remove directory `./foo\nfoo'? y
find: `./foo\nfoo': No such file or directory
rm: remove directory `./foo foo'? y
find: `./foo foo': No such file or directory
Zamiast tego użyj find -print0 z xargs -0, „-exec command {} +” lub -delete, jeśli twoje znalezisko to obsługuje.
Zobacz także tutaj:
/programming/862388/delete-all-files-directories-except-two-specific-directories