Jak przenieść wszystkie pliki z bieżącego katalogu do katalogu wyższego w systemie Linux?
Próbowałem czegoś takiego mv *.*
, ale to nie działa.
Jak przenieść wszystkie pliki z bieżącego katalogu do katalogu wyższego w systemie Linux?
Próbowałem czegoś takiego mv *.*
, ale to nie działa.
Odpowiedzi:
Polecenie, którego szukasz, to
mv * .[^.]* ..
lub (więcej informacji poniżej):
(shopt -s dotglob; mv -- * ..)
Objaśnienie: mv
polecenie przenosi pliki i katalogi. Ostatnim argumentem mv
jest cel (w tym przypadku katalog jeden krok „w górę” w drzewie, ..
). Argumenty poprzedzające to pliki źródłowe i katalogi. Gwiazdka ( *
) to symbol wieloznaczny, który pasuje do wszystkich plików, które nie zaczynają się od kropki. Pliki zaczynające się od kropki (pliki kropkowe) są „ukryte”. Są one dopasowywane za pomocą wzorca .[^.]*
(patrz edycja poniżej).
Aby uzyskać więcej informacji, zobacz stronę podręcznika, z którą się połączyłem mv
.
.[^.]*
zamiast .*
?Jak słusznie zauważa Chris Johnsen : wzór .*
również pasuje .
i ..
. Ponieważ nie chcesz (i nie możesz) przenieść ich, lepiej jest użyć wzorca, który pasuje do dowolnej nazwy pliku rozpoczynającej się od kropki oprócz tych dwóch . Wzór .[^.]*
robi to tylko: pasuje do dowolnej nazwy pliku (1) zaczynającej się od kropki (2), po której następuje znak, który nie jest kropką (3), po której następuje zero lub więcej dowolnych znaków.
Jak wskazuje Paggas , musielibyśmy również dodać wzór , aby dopasować pliki zaczynające się od dwóch kropek. Zobacz jego odpowiedź na alternatywne rozwiązanie ..??*
find
Odpowiedź Arjana wspomina shopt
, aby uniknąć tych wszystkich problemów z plikami dot. Ale nadal występuje problem z plikami zaczynającymi się od myślnika. I wymaga trzech poleceń. Mimo to podoba mi się ten pomysł. Proponuję użyć tego w następujący sposób:
(shopt -s dotglob; mv -- * ..)
Wykonuje się to shopt
w podpowłoce (a więc nie jest shopt
wymagane drugie wywołanie ) i używa --
, aby pliki zaczynające się od myślnika nie były interpretowane jako argumenty mv
.
.*
może spowodować, że mv wyświetli ostrzeżenia / błędy o niemożności poruszania się .
i ..
. Zamiast mv * .[^.]* ..
tego możesz spróbować .
*
, .[^.]*
i ..?*
. Drugi może .[!.]*
dotyczy starszych (POSIX) powłok. Przeczytaj także
Krótka odpowiedź: użyj
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Długa odpowiedź:
Komenda
mv * .* ..
nie będzie działać, ponieważ .*
można dopasować .
i ..
. Ale polecenie
mv * .[^.]* ..
też nie będzie działać, ponieważ .[^.]*
nie pasuje, np. ..filename
! Zamiast tego robię to
mv * .[^.] .??* ..
który pasuje do wszystkiego oprócz .
i ..
. *
dopasuje wszystko, co nie zaczyna się od .
, .[^.]
dopasuje wszystkie 2-znakowe nazwy plików zaczynające się od kropki, z wyjątkiem ..
, i .??*
dopasuje wszystkie nazwy plików rozpoczynające się od kropki z co najmniej 3 znakami.
Jeszcze lepiej, możesz użyć
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
co pozwala uniknąć brzydkich włamań do globu mv * .[^.] .??* ..
!
..?*
do mojego komentarza, a ty już się tym zająłeś.
mv
przestać szukać dalszych opcji poleceń. Nawiasy klamrowe to wynikowa nazwa pliku. Znak plus mówi, że zamiast uruchamiać exec na wynik (tj. Na nazwę pliku), umieść jak najwięcej wyników w jednym exec. Dla kompletności -t..
mówi przeniesienie docelowego miejsca docelowego, aby przenieść wszystkie te pliki do.
Ze względu na kompletność można również powiedzieć powłoce Bash, aby zawierała ukryte pliki, używając shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
Mv nie ma możliwości przenoszenia ukrytych plików podczas korzystania *
- dlaczego więc nie użyć kopiowania?
cp -rf . ..
rm -rf *
Nie musisz wchodzić w złożone rozwiązania dotglobbingu i używania poleceń find.
rsync -a --remove-source-files . ..
rsync
to niezwykle potężne narzędzie do kopiowania plików, zwykle używane do wykonywania wydajnych przyrostowych zdalnych kopii zapasowych i kopii lustrzanych.
Za pomocą powyższego polecenia mówimy, rsync
aby skopiować zawartość .
do..
Przełącznik -a
umożliwia rekurencję do .
podkatalogów i włącza inne popularne opcje.
Przełącznik --remove-source-files
informuje rsync, aby usunął pliki źródłowe po udanej kopii, tzn. Powoduje, że rsync zachowuje się podobnie do mv
polecenia.
--remove-source-files
nie usuniesz (zsynchronizowanych) katalogów.
-bash: /bin/mv: Argument list too long
błąd. Ten działa jak urok.
Ostatecznie próba mv .
zakończy się niepowodzeniem, ponieważ mv nie będzie w stanie odłączyć katalogu, w którym aktualnie się znajdujesz. Możesz mv * ..
przenieść pliki do cwd.
mv * .??* ../.
*
pobiera wszystkie pliki bez kropek. .??*
dostaje wszystko. pliki o długości co najmniej trzech bajtów, co działa dla wszystkich legalnych. Wszystko, co prawdopodobnie chcesz, rm
a nie mv
tak.
../.
Nie oferuje żadnych bezpośrednich korzyści nad ..
ale kiedy robi przełączenia do katalogu jest to bardzo dobry zwyczaj, aby dostać się, bo to się nie uda, jak chcesz, jeśli coś jest nie tak ze ścieżką. Na przykład, mv xyz bletch
jeśli uważasz , żebletch
jest katalogiem, możesz być bardziej pewny dzięki mv xyz bletch/.
.
.[^.]
aby uzyskać pliki okładki takie jak .a
.
To zminimalizowane polecenie działa na większości nowoczesnych powłok:
\mv -- {,.{[^.],??}}* ..
W innym przypadku wymieniono przenośne rozwiązanie:
\mv -- * .[^.] .??* ..
Cechy:
\ zapobiega niepożądanemu zmienianiu mv przez aliasy.
- zapobiega interpretowaniu nazw plików zawierających wiodące łączniki (-xyz) jako argumentów wiersza poleceń.
. [^.] pasuje do wszystkich dwóch nazw plików rozpoczynających się od. z wyjątkiem ..
. ?? * pasuje do wszystkich innych nazw plików składających się z trzech lub więcej znaków.
Naiwne wdrożenia:
Poniższe pomija ukryte nazwy plików UNIX, te zaczynające się od. (.bashrc).
mv * ..
Następujące dopasowania…, które rekurencyjnie próbują przenieść każdy katalog do końca z powrotem do / do… bieżącego katalogu roboczego ($ PWD lub pwd). Nigdy nie używaj.
mv .* ..
Bardziej poprawne jest użycie wzorca * .[!.] .??*
niż * .[^.] .??*
ten pierwszy, który będzie działał również ze starszymi powłokami, takimi jak ksh88:
mv -- * .[!.] .??* ..
--
zapobiega problemom, gdy masz nazwę pliku, która zaczyna się od -
*
pasuje do wszystkich nazw plików, które nie zaczynają się od .
.
można / należy przenieść.[!.]
dopasowuje wszystkie dwie nazwy plików znaków rozpoczynające się od .
.??*
pasuje do wszystkich trzech nazw plików (lub dłuższych), które zaczynają się od .
W przypadku ksh88 wzorzec nazw plików .[^.]
w rzeczywistości będzie pasował do nazw plików ..
(które zawsze istnieją) i .^
(które prawdopodobnie nie istnieją), powodując efekt odwrotny do pożądanego.
Znajdź i grep też działają. Tego rodzaju struktura może być pomocna, jeśli chcesz wybrać pliki według bardziej skomplikowanych kryteriów, modyfikując find i egrep.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
Myślę, że najłatwiejszym rozwiązaniem do przeniesienia wszystkich plików do katalogu nadrzędnego. byłoby
mv "`ls`" ../
lub Jeśli są ukryte pliki / katalogi
posługiwać się:
mv "`ls -a`" ../ 2>/dev/null
Powiedzmy też, że chcesz przenieść zawartość jakiegoś folderu do jednego z tony folderu wewnętrznego (powiedzmy)
posługiwać się:
mv "`ls -a`" /tony 2>/dev/null
Uwaga:
"`ls -a`"
Aby przenieść pliki ze spacjami.
2>/dev/null
Czy dla tłumienia ostrzegawczy / błąd, ponieważ ls -a
byłoby wydrukować .
i ..
folderów, jak również i nie można przenieść lub skopiować je. Więc dla tych folderów pokaże błąd (jeśli nie użyjemy 2> / dev / null), że nie może ich przenieść, a reszta zostanie przeniesiona całkiem wygodnie.
Najlepiej unikać, ls -a
jeśli nie ma ukrytych plików i po prostu użyć ls
.
mv $(ls -a)
? To dotknęłoby bieżący katalog i katalog pod nim, ponieważ również ls -a
wyjdzie ..
.
mv ls -a ../
działałby również w razie potrzeby, tak, pokaże te błędy, jak wspomniałem powyżej, ale poza tym przeniesie wymagane foldery / pliki do katalogu nadrzędnego.
ls
polecenie, aby przenieść pliki ze spacjami. Dokonałem wymaganych zmian. Dzięki za wskazanie.
[linux] [mv] [cwd] [files]
coś podobnego?