Znajdź i skopiuj pliki


128

Dlaczego poniższe elementy nie kopiują plików do folderu docelowego?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'

Odpowiedzi:


273

Jeśli Twoim zamiarem jest skopiowanie znalezionych plików do / home / shantanu / tosend, kolejność argumentów cp zostanie odwrócona:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

Uwaga: polecenie znajdź użyj {} jako symbolu zastępczego dla dopasowanego pliku


14
Jaki jest cel \;?
Astrid

5
@Astrid sprawdź to
shellbye

find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;czy jest coś nie tak z tym poleceniem? to nie działa
środowy

2
Nie działa, jeśli wynik ma spację na ścieżce. Jakieś sugestie?
TheJeff,

1
W Ubuntu 18 nawiasy klamrowe również należy umieścić w pojedynczych cudzysłowach: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo

32

napotkałem problem podobny do tego ...

Właściwie na dwa sposoby można przetwarzać finddane wyjściowe copypolecenia w poleceniu

  1. Jeśli wynik findpolecenia nie zawiera spacji, tj. Jeśli nazwa pliku nie zawiera spacji, możesz użyć poniższego polecenia:

    Składnia: find <Path> <Conditions> | xargs cp -t <copy file path>

    Przykład: find -mtime -1 -type f | xargs cp -t inner/

  2. Ale w większości przypadków nasze pliki danych produkcyjnych mogą zawierać miejsce. Więc przez większość czasu poniższe polecenie jest bezpieczniejsze:

    Składnia: find <path> <condition> -exec cp '{}' <copy path> \;

    Przykład find -mtime -1 -type f -exec cp '{}' inner/ \;

W drugim przykładzie ostatnia część, tj. Średnik, jest również traktowana jako część findpolecenia, którą należy zmienić przed naciśnięciem klawisza Enter. W przeciwnym razie pojawi się błąd podobny do tego

find: missing argument to `-exec'

W twoim przypadku składnia polecenia kopiowania jest nieprawidłowa , aby skopiować plik znalezienia do /home/shantanu/tosend. Następujące polecenie zadziała:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;

3. Jeśli masz GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Przykład:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight

7

Musisz użyć cp -t /home/shantanu/tosend, aby powiedzieć, że argument jest katalogiem docelowym, a nie źródłem. Następnie możesz zmienić go na -exec ... +, cpaby skopiować jak najwięcej plików naraz.


2
W Linuksie trzeba było określić katalog docelowy w następujący sposób: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM

3
Tę odpowiedź można poprawić i skrócić, gdyby podano pełne polecenie, tak jak w pierwszej odpowiedzi.
Brian


-2

Powodem tego błędu jest to, że próbujesz skopiować folder, który wymaga opcji -r również do cp Dzięki


3
Cześć, ponieważ pytanie zostało już udzielone (od jakiegoś czasu), to nie jest tak naprawdę odpowiednia odpowiedź, powinien to być również komentarz (jeśli masz więcej przedstawicieli), chyba że chcesz go rozwinąć i wyjaśnić. Tylko uwaga :).
W1ll1amvl
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.