Czy istnieje sposób mv
, cp
lub jakakolwiek operacja na plikach takie, że mogę określić wszystkie pliki I nie mają wpływu?
Na przykład, że mam folder z plikami file1
, file2
i file3
, i chcę, aby przenieść file1
i file2
gdzieś. Zamiast jawnie nadawać nazwy plikom move ( mv file1 file2 /path/to/destination
), chcę nadać im nazwy plikom, które mają się nie przenosić, i przenieść wszystkie pozostałe w folderze ( mv --some-switch file3 /path/to/destination
)
command-line
rename
scp
Poślizg
źródło
źródło
mv file1 file2 /path/to/destination
nie zrobi tego, co chceszOdpowiedzi:
Można użyć zaawansowanych wzorców globowania w niektórych powłokach, aby dopasować wszystkie pliki w katalogu oprócz tych pasujących do określonego wzorca. Na przykład w ksh, bash lub zsh polecenie
przeniesie wszystkie pliki
/source
do,/destination
z wyjątkiem pasujących plików*.bak
. W Zsh możesz także pisać,/source/^*.bak
jeśli najpierw uruchomiszsetopt extended_glob
, a bardziej ogólnie (ponownie wymagasetopt extended_glob
)/source/*~*.bak
(lub/source/a*~*.bak
dla wszystkich plików, których nazwa zaczyna się oda
oprócz.bak
plików itp.).Zsh ma masowe polecenie kopiuj / przenieś / link, którego można używać między innymi do przenoszenia wszystkich plików oprócz tych pasujących do wzorca. Na przykład następujące polecenie przenosi wszystkie pliki oprócz
*.bak
od/source
dotarget
i dodaje.bak
do nich swoją nazwę:Istnieje kilka poleceń nazywanych
rename
unoszącymi się wokół. W systemach Debian i Ubuntu/usr/bin/rename
jest skryptem perla, który przenosi pliki do nowej nazwy generowanej przez wyrażenie perla. Możesz wykluczyć pliki ze zmiany nazwy, nie generując nowej nazwy, jeśli plik ma zostać wykluczony. Na przykład następujące polecenie (za pomocą tego konkretnegorename
programu) przenosi wszystkie pliki*.bak
z wyjątkiem/source
do/target
:Możesz użyć
find
polecenia, aby wybrać pliki, które chcesz przenieść. Na przykład następujące polecenie przenosi wszystkie zwykłe pliki z wyjątkiem*.bak
do/source
lub podkatalogu do/target
(zwróć uwagę, że struktura katalogów jest zwinięta):lub (bardziej wydajny, jeśli istnieje wiele plików do przeniesienia)
rsync
jest uogólnieniemcp
iscp
z bardzo potężnymi regułami włączania / wyłączania. Na przykład następujące polecenie kopiuje wszystkie pliki z wyjątkiem*.bak
w/source
lub podkatalogu do/target
, z zachowaniem struktury katalogów:pax
jest (między innymi) innycp
na sterydach. Jego reguły wykluczania nie są tak potężne jak rsync, ale ma dodatkową możliwość zmieniania nazw plików podczas ich kopiowania. Jeśli zmienisz nazwę pliku na pusty ciąg, zostanie on wykluczony z kopii. Na przykład następujące polecenie kopiuje wszystkie pliki oprócz*.bak
w/source
lub podkatalogu/target
i zmienia nazwy plików.bak
.Powyższy przykład ma niefortunny efekt uboczny tworzenia nazwanych katalogów
foo.bak
, których można uniknąć, łącząc sięfind
zpax
:źródło
find
polecenie musi się zakończyć\;
+
natychmiast po{}
.