Ostatnio stanąłem przed zadaniem usunięcia wszystkich plików / folderów z katalogu oprócz tych pasujących do określonego wzorca. Przygotowałem więc jednoliniowe polecenie unixowe do wykonania pracy. Czy to musi być tylko jedna linia? Chyba nie, ale w ten sposób jest zdecydowanie chłodniej!
Chociaż problem jest dość prosty, byłem trochę zaskoczony, jak skomplikowane stało się moje rozwiązanie. Oto polecenie, którego użyłem; UWAGA: jest to złe rozwiązanie, ponieważ nie obsługuje nazw plików zawierających znaki przesunięcia wiersza (co nie miało znaczenia w mojej sytuacji).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Nie użyłem polecenia „znajdź”, ponieważ nie chcę się ponownie zapisywać w folderach pasujących do WZORCA. Rozważmy na przykład następującą strukturę plików:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
Użycie wzorca „foo” musi usuwać tylko „first_dir” (i oczywiście jego zawartość) oraz „somefile.txt” ( nie „anotherfile.txt” ani „morefiles.log”).
Pytanie, czy są lepsze (bardziej eleganckie i poprawne) sposoby na osiągnięcie tego?
EDYCJA:
Ostatnio zwrócono mi uwagę, że lepszym rozwiązaniem może być „znajdź” :
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
To rozwiązanie poprawnie obsługuje ścieżki zawierające znaki nowego wiersza.