Tak więc możesz używać *
symbolu wieloznacznego dla wszystkich plików, gdy używasz go cp
w kontekście katalogu. Czy istnieje sposób na skopiowanie wszystkich plików oprócz x
pliku?
54
W bash
możesz użyć extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
gdzie !(b*)
wyklucz wszystkie b*
pliki.
Możesz później wyłączyć za extglob
pomocą
$ shopt -u extglob
find
to jedyny sposób natcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync radzi sobie z tym ładnie.
Przykład skopiuj wszystko:
rsync -aP /folder1/* /folder/2
Przykład skopiuj wszystko z wyłączeniem:
rsync -aP --exclude=x /folder1/* /folder2/
-aP
Przełącznik:a: Podobne do
cp -a
rekurencyjnego itp. P: Pokazuje postęp, miłą cechę rsync.źródło
-rP
zamiast,-aP
jeśli chcesz się powtarzać.-a
służy do archiwizacji. Nie jestem pewien, czy to się zmieniło, czy po prostu inaczej na MacOS.rsync
ma opcję uczynienia go rekurencyjnym. Przykład:rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Testowane tylko na Ubuntu)To nie jest funkcja
cp
, jest to funkcja twojej powłoki (rozwija się tak,*
że oznacza wszystkie pliki bez kropek), więc odpowiedź zależy od używanej powłoki . Na przykładzsh
obsługuje tę składnię:Gdzie
^x
oznacza „wszystkie pliki opróczx
”Możesz także łączyć wzorce wyboru i usuwania zaznaczenia, np. Aby skopiować wszystkie pliki wav oprócz tych zawierających xyz, możesz użyć:
źródło
bash
?Można to również zrobić w zwykłej starej (przenośnej / kompatybilnej) powłoce Bourne'a na wiele sposobów za pomocą standardowych narzędzi w znacznie mniej elegancki sposób niż przy użyciu zaawansowanego globowania powłoki lub poleceń z wbudowanymi opcjami wykluczania.
Jeśli nie ma zbyt wielu plików (i nie zawiera nazw, w tym spacji i / lub podziałów wierszy), może to być sposób:
Oczywiście
bash
narzędzia GNU są świetne i wydajne, ale wciąż nie zawsze są dostępne. Jeśli zamierzasz umieścić go w przenośnym skrypcie, poleciłbymfind
jak w komentarzu Rush.źródło
Jeśli chcesz skopiować wszystko z folderu (łącznie z podfolderami) do określonego podkatalogu:
Działa z sh, bash, zsh (przynajmniej).
źródło
cp -R * subdir/
cp
(nie zbash
/sh
), „cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
”. Kopiowanie jest jednak prawidłowe. Niestety twój wariant zrywa z każdą nazwą pliku zawierającą spację lub interpunkcję wrażliwą na powłokę. Zobacz unix.stackexchange.com/q/128985/135943extglob
to chyba jak dotąd najlepszy sposób.Innym sposobem jest użycie
cp $(ls --ignore=x) subdir/
źródło
$
itp.) Nigdy nie analizuj wynikuls
. unix.stackexchange.com/q/128985/135943