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'
shantanuo
źródło

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

malcolmpdx
źródło
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 \;
Thiyagu ATR
źródło
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.

Ignacio Vazquez-Abrams
źródło
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
-1
for i in $(ls); do cp -r "$i" "$i"_dev; done;
Robert A.
źródło
-2

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

Sebin John
źródło
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