Chciałbym skopiować wszystkie pliki z katalogu poza jednym o nazwie Default.png. Wydaje się, że można to zrobić na kilka sposobów. Co wydaje Ci się najbardziej skuteczne?
Okazuje się, że jest to najlepsze dla mnie, ponieważ wydaje się, że OS X jest dostarczany bez włączonego globu.
Joe Cannatti
6
@Max \;wykonuje polecenie raz na plik. +uruchamia polecenie raz i przekazuje do niego wszystkie nazwy plików naraz (z zastrzeżeniem limitu długości wiersza polecenia). +jest ogólnie bardziej wydajna.
John Kugelman,
149
Powinien wyglądać następująco:
cp -r !(Default.png)/dest
Jeśli kopiujesz do folderu zagnieżdżonego w bieżącym folderze (nazywanym przykładem w poniższym przypadku), musisz również pominąć ten katalog:
Czy kopiujesz pliki do folderu zagnieżdżonego w folderze, z którego kopiujesz?
Jon
47
Wymaga shopt -s extglobto pracy, jeśli zostało wyłączone.
Barry Kelly
5
Wygląda na to, że OS X musi być używany shopt -s extglobzgodnie z opisem @BarryKelly. Dzięki temu działa idealnie.
Kat,
Lat na Bash i nie wiedziałem o !()... Pięknym! Dla tych, którzy - podobnie jak ja - czują, że nadszedł czas, aby przestudiować / przejrzeć bash , oto odpowiednie linki związane z tym pytaniem / odpowiedzią: shopt / extglob i wzór .
Brandt
73
rsync był moim zamiennikiem cp / scp przez długi czas:
Pierwsza komenda nie jest tym, o co prosił OP. Jeśli Default.pngistnieje w dwóch katalogach, zastąpi ten w destdirjednym w srcdir, a następnie usunie skopiowany plik Default.png. Zamiast tego OP chce zachować to, Default.pngco już istnieje w destdir.
SnowFrog
2
co powiesz na default.png już istnieje w destdir? Twoje rozwiązanie nie zadziała.
Iman Mohamadi
2
Działa to świetnie do kopiowania wszystkiego oprócz modułów węzłów :) Ciesz się i dzięki powyższym odpowiedziom właśnie do tego dodałem. Rsync jest moim zdaniem lepszy niż CP, ponieważ możesz zobaczyć pasek postępu bez pytania o to.
Witamy w SO. Niestety twoja odpowiedź jest nieprawidłowa. Wyrażenie nawiasu ( [...]) zawiera zestaw znaków do dopasowania, podczas gdy początkowy ^spowoduje dopasowanie dopełnienia wymienionych znaków. W poniższym przykładzie, ani plik zostanie wymienione: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*ponieważ wszystkie nazwy plików rozpoczynające się z którymkolwiek z następujących znaków zostaną wyłączone: _cefilnopty.
Odpowiedzi:
Proste, jeśli
src/
zawiera tylko pliki:Jeśli
src/
ma podkatalogi, pomija je, ale kopiuje pliki w nich:Jeśli
src/
ma podkatalogi, to się do nich nie powtarza:źródło
\;
wykonuje polecenie raz na plik.+
uruchamia polecenie raz i przekazuje do niego wszystkie nazwy plików naraz (z zastrzeżeniem limitu długości wiersza polecenia).+
jest ogólnie bardziej wydajna.Powinien wyglądać następująco:
Jeśli kopiujesz do folderu zagnieżdżonego w bieżącym folderze (nazywanym przykładem w poniższym przypadku), musisz również pominąć ten katalog:
źródło
shopt -s extglob
to pracy, jeśli zostało wyłączone.shopt -s extglob
zgodnie z opisem @BarryKelly. Dzięki temu działa idealnie.!()
... Pięknym! Dla tych, którzy - podobnie jak ja - czują, że nadszedł czas, aby przestudiować / przejrzeć bash , oto odpowiednie linki związane z tym pytaniem / odpowiedzią: shopt / extglob i wzór .rsync był moim zamiennikiem cp / scp przez długi czas:
źródło
-r
argumencie, jeśli synchronizujesz katalogiPo prostu zrobiłbym:
chyba że pliki są duże. W przeciwnym razie użyj np
źródło
Default.png
istnieje w dwóch katalogach, zastąpi ten wdestdir
jednym wsrcdir
, a następnie usunie skopiowany plikDefault.png
. Zamiast tego OP chce zachować to,Default.png
co już istnieje wdestdir
.Działa to świetnie do kopiowania wszystkiego oprócz modułów węzłów :) Ciesz się i dzięki powyższym odpowiedziom właśnie do tego dodałem. Rsync jest moim zdaniem lepszy niż CP, ponieważ możesz zobaczyć pasek postępu bez pytania o to.
źródło
źródło
źródło
użyj parametru rozszerzającego powłoki z wyrażeniem regularnym
Wszystko zostanie skopiowane z wyjątkiem pliku not_to_copy_file
- jeśli coś jest z tym nie tak. proszę sprecyzuj !
źródło
[...]
) zawiera zestaw znaków do dopasowania, podczas gdy początkowy^
spowoduje dopasowanie dopełnienia wymienionych znaków. W poniższym przykładzie, ani plik zostanie wymienione:touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*
ponieważ wszystkie nazwy plików rozpoczynające się z którymkolwiek z następujących znaków zostaną wyłączone:_cefilnopty
.