Mam folder z wieloma plikami ABC. * (Istnieje około 100 takich plików). Chcę skopiować je wszystkie do nowych plików o nazwach rozpoczynających się od DEF. *
Więc chcę
ABC.Page1
ABC.Page2
ABC.Topic12
...etc
skopiowane do
DEF.Page1
DEF.Page2
DEF.Topic12
...etc
Jaki jest najprostszy sposób, aby to zrobić za pomocą polecenia wsadowego (w BASH lub podobnym)? Myślę o czymś związanym z sed, awk lub xargs, ale mam trudności z ustaleniem składni. Mógłbym napisać skrypt w języku Python, ale myślę, że prawdopodobnie istnieje rozwiązanie w linii poleceń, które nie jest zbyt skomplikowane.
mc
menedżer plików ma najbardziej rozbudowane wsparcie dla tego rodzaju masowych nazw.tar
nie jest wiosennym kurczakiem. Zobacz moją odpowiedź na przykład.Odpowiedzi:
Co powiesz na coś takiego w bash:
możesz to przetestować, umieszczając echo przed poleceniem cp:
źródło
cp /usr/local/lib/libboost* /usr/local/lib/libboost*
z kontrolą echa.Aby to zrobić skutecznie w przypadku dużej liczby plików, lepiej jest unikać uruchamiania
cp
dla każdego innego procesu. Jednym ze sposobów byłoby skopiowanie, a następnie zmiana nazwy przy użyciuprename
(rename
domyślnie jest to dowiązanie symboliczne do dystrybucji opartych na Debianie). Korzystanie z tego i systemu Linuxmktemp
:Aktualizacja
Właściwie
pax
może być lepszym sposobem, aby przejść tutaj:Niestety, mimo że
pax
jest to zarówno POSIX, jak i Linux Standard Base, obecnie niewiele dystrybucji domyślnie go zawiera.źródło
tar
zrobi to dla ciebie naprawdę szybko.TEST
Najpierw stworzyłem 2 katalogi i 10 plików:
Następnie skopiowałem je:
PRZEKSZTAŁCAĆ
Dlatego GNU
tar
zaakceptujesed --transform=EXPRESSION
zmianę nazwy pliku. Może to nawet zmienić nazwę tylko niektórych plików. Na przykład:To jedna zaleta.
STRUMIEŃ
Weź również pod uwagę, że są to tylko dwa
tar
procesy - i to się nie zmieni bez względu na liczbę plików.tar
jest tak zoptymalizowany, jak tylko chcesz. To nigdy nie będzie miało problemów z liczeniem argumentów lub niekontrolowanymi procesami potomnymi. To jest po prostu zrobione A> B.ARGUMENTY
Używam tutaj 7 różnych argumentów połączonych między moimi dwoma
tar
procesami. Najważniejszy wymieniono tutaj jako pierwszy:... a po drugiej stronie
|pipe
...źródło
pax
rozwiązanie tego pytania. Chciałbym dodać to do mojej odpowiedzi, ale myślę, że lepiej tu pasuje -pax -rws '/^ABC/DEF/' ABC.* .
pax
jest określony POSIX - stądpax
.pax
może być POSIX, ale niestety rzadko jest instalowany domyślnie.Jeśli nie masz nic przeciwko użyciu mniej standardowego narzędzia, polecam użycie mmv (ruch masowy), który został napisany do tego rodzaju zadań. Używając
mcp
(kopii masowej), która jest częścią pakietu, możesz po prostu to zrobićNie jest łatwo znaleźć pakiety do pobrania. Aktualny pakiet Debiana (którego Arch używa również w AUR) do kompilacji w domu można znaleźć tutaj .
źródło
apt-get install mmv
W Zsh wstaw następujące wiersze do swojego
.zshrc
:Następnie w wierszu poleceń możesz uruchomić
lub po prostu
W innej powłoce, o ile masz zainstalowany Zsh:
źródło
Możesz to zrobić:
źródło
"${i#*.}"
?Możesz to zrobić: http://www.projectik.eu/index.php/programovanie/linux/item/243-linux-kopirovanie-suborov-vo-vlakne Oto przykład
źródło