Mam partię plików, które kończą się tym samym ciągiem, tzn .: *_ext.dat
znajdują się w kilku podkatalogach wraz z kilkoma innymi plikami, w danym katalogu głównym. Oto struktura:
/main_dir/subdir1/file11_ext.dat
/main_dir/subdir1/file12_ext.dat
/main_dir/subdir1/file13_ext.dat
/main_dir/subdir1/file14_other.dat
/main_dir/subdir1/file15_other.dat
/main_dir/subdir2/file21_ext.dat
/main_dir/subdir2/file22_ext.dat
/main_dir/subdir2/file23_ext.dat
/main_dir/subdir2/file24_other.dat
/main_dir/subdir2/file25_other.dat
/main_dir/subdir3/file31_ext.dat
/main_dir/subdir3/file32_ext.dat
/main_dir/subdir3/file33_ext.dat
/main_dir/subdir3/file34_other.dat
/main_dir/subdir3/file35_other.dat
Muszę rekurencyjnie przenosić tylko pliki kończące *_ext.dat
się na nowy katalog główny new_dir
, z poszanowaniem struktury sub-katalogu, tak aby pliki skończyły się na równoważnej strukturze katalogu:
/new_dir/subdir1/file11_ext.dat
/new_dir/subdir1/file12_ext.dat
/new_dir/subdir1/file13_ext.dat
/new_dir/subdir2/file21_ext.dat
/new_dir/subdir2/file22_ext.dat
/new_dir/subdir2/file23_ext.dat
/new_dir/subdir3/file31_ext.dat
/new_dir/subdir3/file32_ext.dat
/new_dir/subdir3/file33_ext.dat
Z tego powodu polecenie powinno również utworzyć podkatalogi z odpowiadającymi im nazwami. Wiem o tym z taką linią:
find . -name "*_ext.dat" -print0 | xargs -0 rm -rf
Mogę usunąć wszystkie te pliki, ale nie wiem, jak je zmodyfikować, aby zrobić to, czego potrzebuję (lub czy jest to w ogóle możliwe).
linux
command-line
bash
Gabriel
źródło
źródło
rsync --include=*_ext.dat /main_dir/ /new_dir/
. Nie przetestowałem tego jednak.Odpowiedzi:
Najpierw utworzę podkatalogi
new_dir
przezNastępnie można użyć
bash
„sfor
ponownie komendę wraz z ekspansją wzór zrobić dokładnie to, co trzeba szybko:wykorzystując fakt, że istnieją katalogi docelowe. Wreszcie, jeśli nie ma gwarancji, że każdy z nich zostanie rzeczywiście użyty, możesz wyczyścić puste:
źródło
main_dir
niej są tylko katalogi. Nie wpisujesz podwójnie ścieżek w całym kodzie, więc nie będzie działać z nazwami plików zawierającymi spacje. Kod ten będzie znacznie bardziej wytrzymałe:for i in */; do mkdir "../new_dir/$i"; done
. --- Ostatni fragment kodu nie usunie katalogów zawierających puste katalogi. Do tego możesz użyćfind
: Jak usunąć zagnieżdżone puste katalogi za pomocą skryptu Bash w systemie Linux?cd
?) Strona podręcznika użytkownikarmdir
mówi: „OPIS ... Usuń KATALOG (y), jeśli są puste”. Opcja--ignore-fail-on-non-empty
rezygnuje z ostrzeżeń, że niepuste katalogi zostały pominięte. Co więcej, wypróbowałem to na swoim systemie przed wysłaniem./
aby kod był bardziej uniwersalny i działał w większej liczbie przypadków użycia? --- Ostatnie polecenie nie działa:mkdir a ; cd a ; mkdir -p a/b/c d/e/f g/h/i ; ls ; rmdir --ignore-fail-on-non-empty * ; ls
--- wyjście:a d g
a d g