Chcę znaleźć jakieś pliki, a następnie je przenieść.
Mogę znaleźć plik za pomocą:
$ find /tmp/ -ctime -1 -name x*
Próbowałem przenieść je do mojego ~/play
katalogu za pomocą:
$ find /tmp/ -ctime -1 -name x* | xargs mv ~/play/
ale to nie zadziałało. Oczywiście mv potrzebuje dwóch argumentów.
Nie wiesz, czy (lub jak) odwoływać się do „bieżącego elementu” xargs w poleceniu mv?
-I
:find . | xargs -I'{}' mv '{}' ~/play/
, ale jak człowiek mówi, że „zakłada-x
i-L 1
”. Więc nie ma zysku. Lepiej, żeby było to proste i łatwe w użyciufind . -exec mv '{}' ~/play/ \;
Odpowiedzi:
Spójrz na odpowiedź Stephane'a na najlepszą metodę, spójrz na moją odpowiedź z powodów, dla których nie używam bardziej oczywistych rozwiązań (i powodów, dla których nie są one najbardziej wydajne).
Możesz skorzystać z
-I
opcjixargs
:Który działa w podobny sposób jak
find
i{}
. Chciałbym również zacytować twój-name
argument (ponieważ plik zaczynający sięx
od bieżącego katalogu zostałby zarchiwizowany i przekazany jako argument do znalezienia - co nie zapewni oczekiwanego zachowania!).Jednak, jak wskazano w manatwork, jak wyszczególniono na
xargs
stronie man:Należy zauważyć, że
-L 1
oznacza to, że przetwarzany będzie tylko jeden wiersz danych wyjściowychfind
. Oznacza to, że jest składniowo taki sam jak:(która wykonuje jedną
mv
operację dla każdego pliku).Nawet użycie
-0
argumentu GNU xargs ifind -print0
argument powoduje dokładnie takie samo zachowanie-I
- dotyczy toclone()
każdego plikumv
:źródło
Za pomocą narzędzi GNU:
Opcja
-t
(--target
) jest specyficzna dla GNU.-print0
,-r
,-0
, A nie standardowe i pochodzących z GNU występują również w niektórych innych implementacjach jak na niektórych BSD.POSIXly:
Oba uruchamiają tak mało
mv
poleceń, jak to konieczne i działają niezależnie od znaków, jakie mogą zawierać nazwy plików. GNU jeden może mieć tę zaletę, żefind
szuka plików, gdymv
zaczyna przenosić pierwszą partię.Uważaj, aby wszystkie pliki i katalogi znalazły się w jednym katalogu, uważaj na kolizje, jeśli kilka plików w różnych katalogach ma tę samą nazwę.
źródło
mv
raz wszystkie argumenty (lub wszystkie-L
lub-n
, jeśli są dostarczone). W przeciwnym razie wywołaniemv
każdego pliku szybko się zestarzeje (i zwolni).Być może to polecenie jest teraz możliwe i nie było jeszcze w 2013 roku, ale działa to dla mnie idealnie:
Do
-t
kluczowych stawia folder docelowy pierwsze, zwalniającmv
polecenie, aby mieć wszystkie ostatnie argumenty jak tylko pliki mają być przeniesione.źródło
Możesz spróbować z poniższym poleceniem i przetestowane i działa dobrze
źródło