Czy nie jest to twój jedyny błąd, echoktóry nie powinien tam być i $1który powinien być $i?
Julie Pelletier,
jeśli usunę echo i użyję tylko, test$1.oggto powie: test.ogg i test.ogg to te same pliki , więc wygląda na to, że 1 $ nie został rozpoznany?
Czarny
@EdwardBlack: Brzmi, jakbym źle zrozumiał twoje wymagania. To rozwiązanie nie jest odpowiednie.
cuonglm
@JuliePelletier, cholera, czasem zdarza mi się, że przypadkowo piszę $1zamiast $i, jest wcześnie rano, przepraszam ... dziękuję. Użyję $xw przyszłości zamiast$i
Black
Odpowiedzi:
25
Twój kod powłoki ma dwa problemy:
Nie echopowinno tam być.
Zmienna $ijest błędnie wpisana jak $1w nazwie pliku docelowego.
Aby utworzyć kopię pliku w tym samym katalogu, co sam plik, użyj
cp thefile thecopy
Jeśli wstawisz coś jeszcze, np
cp thefile theotherthing thecopy
wtedy zakłada się, że chcesz skopiować thefilei theotherthingdo katalogu o nazwie thecopy.
W twoim przypadku szuka on pliku o nazwie test.oggi nazwanego echodo skopiowania do katalogu test$1.ogg.
$1Najprawdopodobniej rozszerzyć na pusty ciąg. Dlatego po usunięciu echopolecenia otrzymujesz „test.ogg i test.ogg to te same pliki”; wykonywane polecenie jest zasadniczo
Uwaga: Najprawdopodobniej działałoby to dla 100 kopii, ale dla tysięcy kopii może wygenerować błąd „zbyt długiej listy argumentów”. W takim przypadku powróć do korzystania z pętli.
jak sugeruje @Gilles, użycie teema wadę polegającą na tym, że nie zachowuje żadnych metadanych pliku. Aby rozwiązać ten problem, może być konieczne uruchomienie polecenia poniżej:
Jest to potencjalnie szybsze niż wielokrotne wywołania do cp(zależy od rozmiaru pliku w stosunku do dostępnej pamięci), ale ma tę wadę, że nie zachowuje żadnych metadanych pliku.
Gilles „SO- przestań być zły”
@Gilles, och, czy możemy to przezwyciężyć?
Rahul,
3
Możesz biegać cp --attributes-onlypóźniej.
Gilles „SO- przestań być zły”
@Gilles dzięki, zaktualizowałem moją odpowiedź zgodnie z twoją pomocą.
Rahul,
FWIW żadna z pozostałych odpowiedzi nie posłużyła cp -pdo zachowania metadanych.
roaima
11
for i in{1..100};do cp test.ogg "test_$i.ogg";done
Jest to to samo, co dwie poprzednie odpowiedzi i komentarz, z wyjątkiem tego, że (1) pytanie zawiera około 100, a twoja odpowiedź wykorzystuje 10, (2) niepotrzebnie dodałeś -rvfopcje cpi (3) nie podałeś swojego rozszerzenia zmiennej . (Zwróć również uwagę, że konwencjonalne jest umieszczanie spacji między symbolami interpunkcyjnymi, takimi jak ;i następującym słowem.) Dodanie -popcji jest cenne, ale (4a) zostało już rozwiązane (w komentarzach) i (4b) twoja odpowiedź nie jest przydatne, jeśli nie wyjaśnisz, co robisz.
echo
który nie powinien tam być i$1
który powinien być$i
?test$1.ogg
to powie: test.ogg i test.ogg to te same pliki , więc wygląda na to, że 1 $ nie został rozpoznany?$1
zamiast$i
, jest wcześnie rano, przepraszam ... dziękuję. Użyję$x
w przyszłości zamiast$i
Odpowiedzi:
Twój kod powłoki ma dwa problemy:
echo
powinno tam być.$i
jest błędnie wpisana jak$1
w nazwie pliku docelowego.Aby utworzyć kopię pliku w tym samym katalogu, co sam plik, użyj
Jeśli wstawisz coś jeszcze, np
wtedy zakłada się, że chcesz skopiować
thefile
itheotherthing
do katalogu o nazwiethecopy
.W twoim przypadku szuka on pliku o nazwie
test.ogg
i nazwanegoecho
do skopiowania do katalogutest$1.ogg
.$1
Najprawdopodobniej rozszerzyć na pusty ciąg. Dlatego po usunięciuecho
polecenia otrzymujesz „test.ogg i test.ogg to te same pliki”; wykonywane polecenie jest zasadniczoTo prawdopodobnie błąd.
Na koniec chcesz coś takiego:
Lub jako alternatywa
Lub używając
tee
:Uwaga: Najprawdopodobniej działałoby to dla 100 kopii, ale dla tysięcy kopii może wygenerować błąd „zbyt długiej listy argumentów”. W takim przypadku powróć do korzystania z pętli.
źródło
Krótki i precyzyjny
a nawet lepiej
zobacz tee wykorzystanie polecenia , aby uzyskać pomoc.
Aktualizacja
jak sugeruje @Gilles, użycie
tee
ma wadę polegającą na tym, że nie zachowuje żadnych metadanych pliku. Aby rozwiązać ten problem, może być konieczne uruchomienie polecenia poniżej:źródło
cp
(zależy od rozmiaru pliku w stosunku do dostępnej pamięci), ale ma tę wadę, że nie zachowuje żadnych metadanych pliku.cp --attributes-only
później.cp -p
do zachowania metadanych.źródło
Następujące polecenie skopiuje plik. A 5 razy:
Jeśli wolisz dd (nie to samo co cp!):
źródło
Nie wywołałeś zmiennej i podczas kopiowania
użyj poniżej skryptu. Po przetestowaniu działało dobrze
źródło
-rvf
opcjecp
i (3) nie podałeś swojego rozszerzenia zmiennej . (Zwróć również uwagę, że konwencjonalne jest umieszczanie spacji między symbolami interpunkcyjnymi, takimi jak;
i następującym słowem.) Dodanie-p
opcji jest cenne, ale (4a) zostało już rozwiązane (w komentarzach) i (4b) twoja odpowiedź nie jest przydatne, jeśli nie wyjaśnisz, co robisz.