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?
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?
Odpowiedzi:
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 na tcsh
: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.
-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ład zsh
obsługuje tę składnię:
$ cp ^x /path/to/destination
Gdzie ^x
oznacza „wszystkie pliki oprócz x
”
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ć:
cp *.wav~*xyz*
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:
cp `ls | egrep -v '^excludename$'` destdir/.
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łbym find
jak w komentarzu Rush.
Jeśli chcesz skopiować wszystko z folderu (łącznie z podfolderami) do określonego podkatalogu:
cp -R $(ls | grep -v '^subdir$') subdir/
Działa z sh, bash, zsh (przynajmniej).
cp -R * subdir/
cp
(nie z bash
/ 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/135943
extglob
to chyba jak dotąd najlepszy sposób.
Innym sposobem jest użycie
cp $(ls --ignore=x) subdir/
$
itp.) Nigdy nie analizuj wyniku ls
. unix.stackexchange.com/q/128985/135943