Mam kilka plików:
10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg
Chcę zmienić nazwę w tym formacie:
10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg
Musi usunąć _
znacznik czasu i dodać _TIMING
.
command-line
batch-rename
Jojo Mendoza
źródło
źródło
10.3.100.179
z10.4.100.135
. Czy tego właśnie chcesz, czy chcesz po prostu usunąć_TIMING
i_
od czasu?10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg
(a „TIMING” mógłby nawet zostać usunięty, ponieważ teraz wygląda wyraźnie jak data i godzina (i milisekundy), szczególnie gdy standard staje się bardziej rozpowszechniony. T jest częścią standardu, a ja dorastał, aby to lubić (i wyjęcie go łamie standard ^^):
w nazwie pliku. Wierzę, że Windows go nie obsługuje.Odpowiedzi:
Zainstaluj
renameutils
i używajqmv
z ulubionym edytorem tekstu.qmv
ładuje wszystkie nazwy do edytora, a po zapisaniu i zamknięciu stosuje zmiany do rzeczywistych plików. Jeśli zmiany są niespójne (np. Dwa pliki mają tę samą nazwę), zostanie przerwane bez dotykania czegokolwiek. Obsługuje również poprawnie okrągłe zmiany nazw.Zwyklę robię:
tak, że pokazuje tylko jedną kolumnę nazw (do: only-destination-only). Oto jak to wygląda:
Jeśli połączysz go z wieloma kursorami SublimeText, Atom lub Visual Studio Code, będzie to bardzo ładne i potężne narzędzie do masowej zmiany nazw. Na przykład zrobiłbyś to dla Atom
EDITOR="atom -w" qmv -f do
.źródło
Użyj
rename
...Dzięki
-n
temu wygeneruje to, co zrobi bez wprowadzania żadnych zmian:Jeśli wszystko wygląda poprawnie, usuń
-n
Wyjaśnienie ...
s/something/something_else/
wyszukaj i zamień^
początek nazwy (zakotwiczenie)[0-9]
Jakikolwiek numer+
jeden lub więcej poprzedzających znaków\.
dosłowny.
(bez\
tego pasuje dowolny znak)()
zachować tę część$1$2$3$3
wstecz odniesienia do rzeczy pasujących wcześniej i zachowanych()
Uwaga:
*
na końcu polecenia pasuje wszystkie widoczne pliki w bieżącym katalogu. W razie potrzeby użyj bardziej odpowiedniego globu.źródło
prename
(p dla perla, ponieważ pierwszy argument jest wyrażeniem perla)mmv
można to zrobić w następujący sposób:# 1, # 2, # 3, ... odnosi się tutaj do pasującego „*” tutaj.
Jest jeszcze krótszy z:
źródło
Inne
rename
podejście:Jeśli wydaje się, że działa tak, jak chcesz, usuń
-n
.źródło
Możesz także użyć następujących. Najpierw wykonaj kopię zapasową plików i wypróbuj to:
sed 's/\(.*\)_\(.*\)_/\1\2/')
usuwa_
znaki ze znacznika czasu.Na przykład:
źródło
find -maxdepth 1 -exec rename ... {} +
aby wsadować listę bieżącego katalogu do wiersza polecenia zmiany nazwy. (dodaj-name *.jpg
lub cokolwiek chcesz). To zadziała znacznie szybciej niż pętla powłoki, która rozwidla + execsed
imv
dla każdej nazwy pliku, zamiast tylko zmiany nazwy wywołania systemowego. (Można się pozbyćsed
korzystania z wbudowanych wyrażeń regularnych basha, ale rozwidlaniemv
jest nadal powolne.)Prawdopodobnie skończyłeś, ale oto (proste) całe
bash
rozwiązanie:Czy „proste ... rozwiązanie bash” jest oksymoronem?
PS: Logika w pętli została przetestowana z jedną z twoich przykładowych nazw plików. Przeszło.
źródło
[[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]];
newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpg
czymś innym . (całkowicie niesprawdzone i prawdopodobnie błędne, ale ogólną ideą jest to, że grupy przechwytywania przechodzą do tablicy BASH_REMATCH.)bash
) przechwytywania grup, i szczerze mówiąc, bash nie jest pierwszym językiem, w którym chciałbym je wypróbować. (Myślę, żebash
to brzydki język.) Mimo to jest to dobre rozwiązanie i nauczyło mnie czegoś tak godnego podziwu.printf -v "$3" ...
ustawienia zmiennej, której nazwa jest w nazwie$3
). Rozebranie całej linii poleceń i odłożenie jej z powrotem razem jest to dość trudne do śledzenia / debugowania, przynajmniej znalazłem to w ten sposób, próbując to naprawić / naprawić błędy. Zobacz kod na githubJeśli możesz użyć GUI, polecam pyRenamer .
Jest obecny w większości dystrybucji, fi w Ubuntu:
Może zrobić wszystko, co chcesz i więcej.
źródło
Oto Twoje surowe wbudowane
find
+xargs
+sed
+mv
oneliner (Love Oneliner):Wyjaśnienie:
find . -name "*.jpg" | sort | xargs sh -c <command> sh
: wyświetl listę wszystkich plików JPEG w bieżącym katalogu, a następnie wykonaj polecenie powłoki dla każdego z nich (sortowanie jest oczywiście opcjonalne, ale zachowaj porządek, jeśli gdzieś się logujesz)-print0
,-z
,-0
: To dobry zwyczaj, aby odrębne pozycje z binarnym0
gdy tokenizing nazw plików, aby uniknąć problemów z in-the-middle-białe przestrzenie (choć nie twoja sprawa)mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");
: (odwrotne ukośniki wsed
wyrażeniu regularnym nie pomagają w jego czytelności, ale jest to proste) zmień nazwę każdego pliku, zastępując sekwencję podkreśloną 8 + 6 + 4 cyfr ich ciągłą konkatenacją plus to_TIMING
coś (\i
jest to odwołanie doi
- grupa wyrażeń regularnych).Refs: Xargs - mężczyzna sed
źródło