Utworzyłem następujący skrypt, który przenosi pliki starych dni, zgodnie z definicją z katalogu źródłowego do katalogu docelowego. Działa idealnie.
#!/bin/bash
echo "Enter Your Source Directory"
read soure
echo "Enter Your Destination Directory"
read destination
echo "Enter Days"
read days
find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \;
echo "Files which were $days Days old moved from $soure to $destination"
Ten skrypt świetnie przenosi pliki, przenosi także pliki z podkatalogu źródłowego, ale nie tworzy podkatalogu do katalogu docelowego. Chcę zaimplementować w nim tę dodatkową funkcję.
z przykładem
/home/ketan : source directory
/home/ketan/hex : source subdirectory
/home/maxi : destination directory
Kiedy uruchamiam ten skrypt, przenosi on również pliki hex w katalogu maxi, ale potrzebuję, aby ten sam hex został utworzony w katalogu maxi i tam przenosił pliki w tym samym hexie.
źródło
for x do
, brakuje ci;
tam :). Poza tym nie mam pojęcia, co chciałbyś osiągnąć,$0
ale jestem przekonany, że tak będziesh
:).for x; do
technicznie nie jest zgodny z POSIX (sprawdź gramatykę ), ale nowoczesne powłoki pozwalają na jednofor x do
i drugiefor x; do
; niektóre stare muszle Bourne'a się nie zmokłyfor x; do
. Na nowoczesnych powłokach, zsh -c '…' arg0 arg1 arg2 arg3
,arg0
staje się$0
,arg1
staje się$1
itp. Jeśli chcesz$0
byćsh
, musisz pisaćsh -c '…' sh arg1 arg2 arg3
. Ponownie niektóre powłoki Bourne'a zachowywały się inaczej, ale POSIX to określa.pushd
wydaje się lepszym wyboremcd
, ponieważ jest mniej ingerujący w obecne środowisko.Wiem, że
find
zostało określone, ale brzmi to jak praca dlarsync
.Najczęściej używam następujących:
Oto dobry przykład, jeśli chcesz przenosić tylko pliki określonego typu ( przykład ):
źródło
--remove-source-files
było to pomocne, co skutecznie powoduje przenoszenie plików zamiast ich kopiowania. To niesamowite wykorzystanie rsync.możesz to zrobić za pomocą dwóch instancji find (1)
Zawsze jest cpio (1)
Sprawdź argumenty dla CPIO. Te, które dałem
źródło
To nie jest tak wydajne, ale kod jest łatwiejszy do odczytania i zrozumienia, moim zdaniem, jeśli po prostu skopiujesz pliki, a następnie usuniesz je.
Uwaga: Błąd wykryty przez @MV w operacjach automatycznych:
źródło
Możesz to zrobić, dodając bezwzględną ścieżkę do pliku zwróconego przez
find
ścieżkę docelową:źródło
$destination
zawiera znaki specjalne, ponieważ ulega rozszerzeniu w wewnętrznej powłoce. Może miałeś na myślidestination='\'"$destination"\''
? To wciąż się psuje'
. Tworzy to również pliki takie jak/home/maxi/home/ketan/hex/foo
zamiast/home/maxi/hex/foo
.Lepsze (najszybsze i bez zajmowania przestrzeni dyskowej przez kopiowanie zamiast przenoszenia), nazwy plików nie mają także wpływu, jeśli zawierają one znaki specjalne:
Lub szybciej, przenosząc kilka plików w tym samym czasie dla wielu procesorów, używając polecenia „równoległego”:
PS: Masz literówkę, „soure” powinno być „source”. Zachowałem nazwę zmiennej.
źródło
Jest to mniej eleganckie, ale łatwe, jeśli liczba / rozmiar plików nie jest zbyt duża
Spakuj pliki razem do
zip
archiwum, a następnie rozpakuj w miejscu docelowym bez-j
opcji. Domyślnie zip utworzy względną strukturę katalogów.źródło
Wypróbuj w ten sposób:
źródło
Ponieważ wydaje się, że nie ma naprawdę łatwego rozwiązania tego problemu i bardzo go potrzebuję, stworzyłem to narzędzie open source dla systemu Linux (wymaga Pythona): https://github.com/benapetr/smv
Istnieje wiele sposobów wykorzystania go do osiągnięcia tego, czego potrzebujesz, ale prawdopodobnie najprostszym byłoby coś takiego:
Możesz dodatkowo uruchomić go w trybie suchym, aby nie robił nic poza drukowaniem tego, co by zrobił
Lub jeśli lista plików jest zbyt długa, aby zmieścić się w linii argumentów i nie przeszkadza ci wykonywanie Pythona dla każdego pliku, to
źródło