Tak więc, jeśli jestem w katalogu domowym i chcę przenieść foo.c do ~ / bar / baz / foo.c, ale te katalogi nie istnieją, czy istnieje sposób automatycznego utworzenia tych katalogów, aby wystarczy wpisać
mv foo.c ~/bar/baz/
i wszystko się ułoży? Wygląda na to, że możesz użyć aliasu mv do prostego skryptu bash, który sprawdziłby, czy te katalogi istnieją, a gdyby nie, wywołałby mkdir, a następnie mv, ale pomyślałem, że sprawdzę, czy ktoś ma lepszy pomysł.
Odpowiedzi:
Co powiesz na ten jednowarstwowy (w bash):
Podział tego:
tworzy katalog (w tym wszystkie katalogi pośrednie), po czym:
przenosi plik do tego katalogu ($ _ rozwija się do ostatniego argumentu przekazanego do poprzedniej komendy powłoki, tj: nowo utworzonego katalogu).
Nie jestem pewien, jak daleko to zadziała w innych powłokach, ale może dać ci kilka pomysłów na to, czego szukać.
Oto przykład z wykorzystaniem tej techniki:
źródło
./
wszędzie? Argumenty nie są poleceniami w PATH bez.
katalogu ...--parents
nie jest dostępny w systemie macOS 10.13.2. Musisz użyć-p
.mkdir -p ./some/path/foo; mv yourfile.txt $_:h
źródło
dirname
nie wymaga istnienia swojego argumentu, to jedynie manipulacja ciągami. Nie mogę mówić o innych dystrybucjach. Nie ma nic złego w tym błędzie kodu.for f in *.txt; do mkdir -p `dirname /destination/${f//regex/repl}`; mv "$f" "/destination/${f//regex/repl}; done
Zapisz jako skrypt o nazwie mv lub mv.sh
Lub umieść na końcu pliku ~ / .bashrc jako funkcję, która zastępuje domyślny mv na każdym nowym terminalu. Użycie funkcji pozwala bashowi zachować pamięć, zamiast za każdym razem czytać plik skryptu.
Są one oparte na przesłaniu Chrisa Lutza.
źródło
mv
polecenia. Jest to szczególnie przydatne w przypadku skryptów, tzn. Niekoniecznie chcesz uruchamiać kontrole i uruchamiać je wmkdir -p
dowolnym momenciemv
. Ale ponieważ chciałbym mieć domyślne zachowanie błędumv
, zmieniłem nazwę funkcji namvp
- aby wiedzieć, kiedy mogę tworzyć katalogi.[ ! -a "$dir" ]
przeprowadzonych przeze mnie eksperymentów z prawą połową, która jest prawdziwa i fałszywa, obie ocenione na prawdę… ??? Dla innych, tmp = "$ {tmp: -1}" wydaje się chwytać ostatni znak pliku, aby upewnić się, że nie jest to ścieżka (/)Możesz użyć
mkdir
:Prosty skrypt, aby zrobić to automatycznie (nieprzetestowany):
źródło
Wygląda na to, że odpowiedź brzmi nie :). Nie chcę tak naprawdę tworzyć aliasu ani func, aby to zrobić, często dlatego, że jest to jednorazowe i już jestem w trakcie pisania
mv
polecenia, ale znalazłem coś, co działa dobrze:Jeśli się
mv
nie powiedzie (katalog nie istnieje), utworzy katalog (który jest ostatnim argumentem do poprzedniego polecenia, tak$_
też jest). Po prostu uruchom to polecenie, a następnie upuruchom je ponownie i tym razemmv
powinno się to udać.źródło
Może następujący skrypt powłoki?
To podstawowa część. Możesz dodać trochę, aby sprawdzić argumenty, i możesz zmienić zachowanie, jeśli miejsce docelowe istnieje, katalog źródłowy istnieje lub nie istnieje (tj. Nie zastępuj czegoś, co nie istnieje) .
źródło
Komenda rsync może wykonać lewę tylko wtedy, gdy ostatni katalog w ścieżce docelowej nie istnieje, np. w przypadku ścieżki docelowej
~/bar/baz/
ifbar
istnieje, alebaz
nie istnieje , można użyć następującej komendy:rsync -av --remove-source-files foo.c ~/bar/baz/
W takim przypadku
baz
katalog zostanie utworzony, jeśli nie istnieje. Ale jeśli obiebar
ibaz
nie istnieją rsync zawiedzie:Zasadniczo powinien być bezpieczny
rsync -av --remove-source-files
jako alias dlamv
.źródło
Najprostszym sposobem na to jest:
Załóżmy, że pobrałem pliki pdf znajdujące się w moim katalogu pobierania (
~/download
) i chcę przenieść je wszystkie do katalogu, który nie istnieje (powiedzmymy_PDF
).Wpiszę następujące polecenie (upewniając się, że mój bieżący katalog roboczy to
~/download
):Możesz dodać
-p
opcję,mkdir
jeśli chcesz utworzyć podkatalogi w następujący sposób: (przypuszczalnie chcę utworzyć podkatalog o nazwiepython
):źródło
Sillier, ale działający sposób:
Utwórz katalog z mkdir -p zawierający katalog tymczasowy, który ma wspólną nazwę pliku docelowego, następnie usuń katalog nazwy pliku za pomocą prostego rmdir, a następnie przenieś plik do nowego miejsca docelowego. Myślę, że odpowiedź za pomocą dirname jest prawdopodobnie najlepsza.
źródło
źródło
Kod:
Przykład:
argumenty: „d1” „d2 / sub”
źródło
Zostanie przeniesiony
foo.c
do nowego katalogubaz
z katalogiem nadrzędnymbar
.-p
Opcjamkdir
spowoduje utworzenie katalogów pośrednich zgodnie z wymaganiami.Bez
-p
wszystkich katalogów w ścieżce prefiks musi już istnieć.Wszystko w backticks
``
jest wykonywane, a dane wyjściowe są zwracane w linii w ramach polecenia.Ponieważ
mkdir
nic nie zwraca, tylko polecenieecho $_
zostanie dodane do polecenia.$_
odwołuje ostatni argument do poprzednio wykonanej komendy.W takim przypadku zwróci ścieżkę do nowego katalogu (
~/bar/baz/
) przekazanego domkdir
polecenia.Rozpakowałem archiwum bez podania miejsca docelowego i chciałem przenieść wszystkie pliki oprócz
demo-app.zip
mojego bieżącego katalogu do nowego katalogu o nazwiedemo-app
.Następująca linia załatwia sprawę:
ls -A
zwraca wszystkie nazwy plików, w tym pliki ukryte ( z wyjątkiem niejawnych.
i..
).Symbol potoku
|
służy do potokowania danych wyjściowychls
poleceniagrep
( narzędzie wiersza polecenia, wyszukiwanie tekstowe ). Flag kieruje odnaleźć i zwrócić wszystkie nazwy plików z wyłączeniem . Ta lista plików jest dodawana do naszego wiersza poleceń jako argumenty źródłowe do polecenia move . Argument docelowy jest ścieżką do nowego katalogu przekazywanego do referencyjnego za pomocą i wyjściowego za pomocą .-v
grep
demo-app.zip
mv
mkdir
$_
echo
źródło
Możesz nawet użyć rozszerzeń nawiasów:
Musisz użyć wersji bash 3.0 lub nowszej.
źródło
źródło
Moje jedno stringowe rozwiązanie:
źródło
Możesz łączyć polecenia:
mkdir ~/bar/baz | mv foo.c ~/bar/baz/
lub skrypt powłoki jest tutaj:
1. Otwórz dowolny edytor tekstu.
2. Skopiuj i wklej skrypt powłoki.
3. Zapisz go jako mkdir_mv.sh
4. Wejdź do katalogu skryptu:
cd your/script/directory
5. Zmień tryb pliku :
chmod +x mkdir_mv.sh
6. Ustaw alias :
alias mv="./mkdir_mv.sh"
Teraz, za każdym razem, gdy uruchomisz polecenie,
mv
zostanie utworzony katalog przenoszenia, jeśli nie istnieje.źródło
Na podstawie komentarza w innej odpowiedzi, oto moja funkcja powłoki.
Dodaj to w .bashrc lub podobnym, abyś mógł używać go wszędzie.
źródło