Mam listę folderów, które mają daty nazwisk. Daty są w formacie RRRRMMDD (np. 20150129). W tych folderach znajdują się dokumenty tekstowe powiązane z tą konkretną datą.
Chciałbym zmienić ich strukturę w hierarchii folderów z roku na miesiąc i przesuwać dokumenty tekstowe do odpowiedniego folderu „data” niżej w hierarchii.
Innymi słowy, chciałbym, aby folder „root” został nazwany po roku takim jak 2015, a następnie utwórz podfoldery o nazwach takich jak 01, a następnie utwórz kolejne podfoldery o nazwach takich jak 29, które zawierają odpowiednie dokumenty tekstowe .
Więc ścieżka wyglądałaby jak 2015/01/29/file.txt
lub 2015>01>29>file.txt
.
Rzuciłem okiem na Automator i wydaje się, że coś takiego nie jest możliwe, chociaż mogę się mylić, więc chciałbym wiedzieć ...
Czy istnieje jakieś łatwe rozwiązanie tego problemu, które każdy laik może zrozumieć, na przykład przepływ pracy Automatora, czy też wymaga to pewnego zrozumienia poleceń terminalowych i wyrażeń regularnych?
Jak rozwiązać ten problem, pod warunkiem że istnieje rozwiązanie?
Odpowiedzi:
Zakładając, że wszystkie te foldery RRRRMMDD są częścią tego samego katalogu nadrzędnego, który można uruchomić
for d in */; do
Pętli odczytuje wszystkie wpisy Directory, spływu/
zapewnia, że tylko nazwy katalogów rzeczywiście pasuje[[ $d =~ [0-9]{8}/ ]]
sprawdza, czy bieżący wpis składa się z 8 cyfr i kontynuuje od następnego wpisu, jeśli nie${d:0:4}/${d:4:2}/${d:6:2}
używa rozszerzenia parametrów wbash
celu utworzenia ciągu zawierającego nową ścieżkę--
W obumkdir
imv
zapobiega problemu w przypadku katalogu lub pliku nazwa rozpoczyna się-
. Nie może się tu zdarzyć, ale i tak jest to prawdopodobnie dobra praktyka.Podziękowania dla @terdon i @ user3439894 za pomysły na ulepszenie oryginalnego skryptu.
źródło
W terminalu można użyć następujących opcji.
cd
do zawierającego folder, a następnie uruchom następujące polecenie:find . -type f
uzyskuje rekursywnie każdy plik w bieżącym katalogu.-exec bash -c
otwiera powłokę, aby uruchomić następujące polecenia.F=$(…)
otwiera podpowłokę i używa sed na ścieżce pliku do manipulowania ścieżką do folderów.^\./([0-9]{4})([0-9]{2})([0-9]{2})
jest wyrażeniem regularnym z trzema grupami przechwytywania, takimi jak: zastępowanie, w którym każda grupa przechwytywania ( itd.) jest oddzielona . tworzy katalogi do przeniesienia plików. przenosi każdy plik do odpowiedniego folderu.\1/\2/\3
\1
/
mkdir -p -- $(dirname "$F")
mv -- "$1" "$F"
Pobiera to hierarchię po lewej stronie i konwertuje ją do hierarchii po prawej:
Jeśli w folderze zawierającym są inne pliki z datą jako nazwą, zostaną one przeniesione tak, jakby były folderem. Aby temu zapobiec, zamień drugą linię na:
W
(?:/.+)
związku z tym zapewnia, że ścieżka ma kolejny komponent, ignorując wszystko bez dziecka w katalogu nadrzędnego, które są pliki.źródło