Skopiuj i wklej kilka plików o innej nazwie

10

Mam kilka plików tekstowych o nazwie

foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
...
...
foo_bar_abc_1_1000_geh_original.in

Chciałbym skopiować (i zachować oryginalne pliki) każdy plik i wkleić go pod różnymi nazwami (w tym samym folderze), np.

foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_03_geh_copy.in
...
...
foo_bar_abc_1_1000_geh_copy.in

Jak mogę to zrobić za pomocą prostego skryptu?

zjawisko
źródło

Odpowiedzi:

13

Przejdź do katalogu, w którym masz oryginalne pliki.

Następnie przetestuj za pomocą następującego wiersza polecenia,

for i in *_original.*;do echo cp -p "$i" "${i/_original./_copy.}";done

a jeśli wygląda dobrze, usuń echoi wykonaj kopiowanie,

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done
sudodus
źródło
8

Możesz użyć mcpz mmvpakietuZainstaluj mmv w następujący sposób:

mcp "*original*" "#1copy#2"

Spowoduje to skopiowanie każdego pliku zawierającego ciąg „oryginał” w bieżącym katalogu i zastąpienie tego ciągu ciągiem „copy”. Możesz przetestować, co mcpzrobisz, dodając -nflagę, jednak nie będzie ona po cichu zastępować plików, ale poprosi o to. Korzystanie mmvma tę zaletę cp, że nie trzeba wywoływać go dla każdego pliku - z tysiącem plików, które wydaje się kopiować, to robi różnicę.

Możesz również użyć GNUparallel Zainstaluj równolegle w następujący sposób ( --dry-rundo testowania, usuń go, aby wykonać kopiowanie):

parallel --dry-run cp -p "{}" "{=s/original/copy/=}" ::: *

lub, jeśli daje to błąd „Zbyt długa lista argumentów”:

printf "%s\0" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"

Przykładowy przebieg

$ ls -1
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_original.in
$ mcp "*original*" "#1copy#2"
$ ls -1
foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_copy.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_copy.in
foo_bar_abc_1_04_geh_original.in

Spójrzmy time, uruchom ponad 1000 plików po 100 KiB każdy na wolnym komputerze:

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s
deser
źródło