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?
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?
Odpowiedzi:
Proste, jeśli src/
zawiera tylko pliki:
find src/ ! -name Default.png -exec cp -t dest/ {} +
Jeśli src/
ma podkatalogi, pomija je, ale kopiuje pliki w nich:
find src/ -type f ! -name Default.png -exec cp -t dest/ {} +
Jeśli src/
ma podkatalogi, to się do nich nie powtarza:
find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +
\;
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:
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:
cp -r !(Default.png|example) /example
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:
rsync -av from/ to/ --exclude=Default.png
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-r
argumencie, jeśli synchronizujesz katalogi
Po prostu zrobiłbym:
cp srcdir/* destdir/ ; rm destdir/Default.png
chyba że pliki są duże. W przeciwnym razie użyj np
find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/
Default.png
istnieje w dwóch katalogach, zastąpi ten w destdir
jednym w srcdir
, a następnie usunie skopiowany plik Default.png
. Zamiast tego OP chce zachować to, Default.png
co już istnieje w destdir
.
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.
rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules
cp `ls | grep -v Default.png` destdir
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude
użyj parametru rozszerzającego powłoki z wyrażeniem regularnym
cp /<path>/[^not_to_copy_file]* .
Wszystko zostanie skopiowane z wyjątkiem pliku not_to_copy_file
- jeśli coś jest z tym nie tak. proszę sprecyzuj !
[...]
) 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
.