Szukam sposobu (najlepiej terminalu) uporządkowania ponad 1000 czcionek według ich pierwszej litery.
Zasadniczo utwórz katalogi, A-Z, #
a następnie przenieś pliki czcionek do tych katalogów na podstawie pierwszego znaku nazwy pliku. Czcionki rozpoczynające się cyframi [0–9] lub innymi znakami specjalnymi, które mają zostać przeniesione do #
katalogu.
command-line
files
Parto
źródło
źródło
Odpowiedzi:
Późna opcja Pythona:
Jak używać
move_files.py
Uruchom go z katalogiem jako argumentem:
Skrypt utworzy (pod) katalog (-ies) (wielkie litery) tylko wtedy, gdy jest rzeczywiście potrzebny
Wyjaśnienie
Scenariusz:
wyświetla listę plików, pobiera pierwszy znak (definiuje sourcepath):
sprawdza, czy element jest plikiem:
definiuje docelowy folder dla pierwszego znaku, który ma wartość alfa, lub nie:
sprawdza, czy folder już istnieje, czy go tworzy, jeśli nie:
przenosi element do odpowiedniego folderu:
źródło
Gra w golfa, ale czytelny za pomocą tylko dwóch poleceń i dwóch wyrażeń regularnych:
Jeśli masz dużą liczbę plików do przeniesienia, zbyt wiele, aby zmieściły się na liście argumentów procesu (tak, istnieje limit i może to być zaledwie kilka kilobajtów), możesz wygenerować listę plików za pomocą innego polecenia i potoku, aby
prename
, np .:Ma to tę dodatkową zaletę, że nie próbuje przenieść literalnej nazwy pliku,
[[:alnum:]]?*
jeśli żaden plik nie pasuje do wzorca globu.find
pozwala również na wiele więcej kryteriów dopasowania niż globowanie powłoki. Alternatywą jest ustawienienullglob
opcji powłoki i zamknięcie standardowego strumienia wejściowegoprename
. 1W obu przypadkach usuń
-n
przełącznik, aby faktycznie przenieść pliki, a nie tylko pokazać, jak zostaną przeniesione.Dodatek: Możesz ponownie usunąć puste katalogi za pomocą:
1
shopt -s nullglob; prename ... <&-
źródło
Jeśli nie masz nic przeciwko zsh, funkcja i kilka
zmv
poleceń:mmv
Funkcja sprawia, że katalog i przenosi plik.zmv
następnie zapewnia dopasowanie wzorca i podstawienie. Najpierw przenoszenie nazw plików zaczynających się od alfabetu, a następnie wszystko inne:Uruchom ponownie bez
echo
wmmv
„s definicji faktycznie wykonać ruch.źródło
Nie opracowałem dobrego sposobu, aby nazwy katalogów były pisane wielkimi literami (lub przenosić pliki dużymi literami), chociaż można to zrobić później za pomocą
rename
...lub bardziej czytelnie:
Usuń
echo
po przetestowaniu, aby faktycznie przenieść plikiI wtedy
usuń,
-n
jeśli po testach wygląda dobrze i uruchom ponownie.źródło
if [[ -d "${i^}" ]]
zmiennego .i
mkdir {A..Z}
Poniższe polecenia w katalogu zawierającym czcionki powinny działać, jeśli chcesz używać spoza katalogu przechowywania czcionek, zmień
for f in ./*
nafor f in /directory/containing/fonts/*
. Jest to metoda bardzo oparta na powłoce, więc dość powolna, a także nierekurencyjna. Spowoduje to utworzenie katalogów tylko wtedy, gdy istnieją pliki, które zaczynają się od pasującego znaku.Jako jeden wiersz, ponownie z katalogu przechowywania czcionek:
Metoda wykorzystująca find, z podobną manipulacją ciągiem, wykorzystująca interpretację parametrów bash, która będzie rekurencyjna i powinna być nieco szybsza niż wersja czysto powłoki:
Lub bardziej czytelnie:
źródło
Zamapuj każdą nazwę pliku na nazwę katalogu, używając
tr
, a następniemkdir
imv
:źródło
tr
do konwersji na wielkie litery.xargs
aby zadzwonićbash
ponownie? Czy nie byłoby prostsze i znacznie bardziej czytelne umieszczanie danych wyjściowychfind
w pętli while iread
zapisywanie ich po rekordzie?while
wersja pętli ( bit.ly/2j2mhyb ) jest być może lepsza.{}
podstawienia, jeśli pozwoliszxargs
dołączyć argument, a następnie odwołać się do$1
skryptu powłoki, npxargs -0 -n1 -- bash -c 'dir=/dest/$(basename "$1" | ...); ...; mv "$1" "$dir"' _
. : (Pamiętaj o finale_
!)