2011-07-26 16 views
22

Biorę klasę unix/linux i musimy jeszcze uczyć się zmiennych lub funkcji. Właśnie nauczyliśmy się podstawowych narzędzi, takich jak flaga i potok, wyjście i dopisz do pliku. Na zlecenie laboratorium chce, abyśmy znaleźli największe pliki i skopiowali je do katalogu.przekazywanie danych wyjściowych jako argumentu dla cp w bashu

mogę dostać 5 największych pliki, ale nie wiem jak przekazać je do cp w jednym poleceniu

ls -SF | grep -v/| head -5 | cp ? Directory 
+6

'man xargs' jest twoim przyjacielem ... –

+0

Zobacz również [Jak przekazać wyniki do' 'find' cp' taka, że ​​nazwy plików ze spacjami prac] (http : //stackoverflow.com/questions/18724826/how-to-pass-find-results-to-cp-such-that-file-names-with-space-work). – tripleee

Odpowiedz

46

Byłoby:

cp `ls -SF | grep -v/| head -5` Directory 

zakładając, że rurociąg jest poprawna . Backticks zastępują w linii wyjście poleceń wewnątrz niego.

Można również tworzyć testy:

cp `echo a b c` Directory 

skopiuje wszystkie a, b, a c do Directory.

25

zrobiłbym:

cp $(ls -SF | grep -v/| head -5) Directory 

xargs będzie prawdopodobnie najlepszą odpowiedź chociaż.

ls -SF | grep -v/| head -5 | xargs -I{} cp "{}" Directory 
5

Użyj odwrotów `like this` lub dolara $ (jak to), aby wykonać podstawienie poleceń. Zasadniczo to wkleja każdą linię standardowego wyjścia polecenia backticked do otaczającego polecenia i uruchamia je. Dowiedz się więcej na stronie bash pod "Zastępowanie komend".

Ponadto, jeśli chcesz przeczytać jeden wiersz na raz można przeczytać poszczególne linie Spośród strumienia rury przy użyciu „podczas czytania” składnię:

ls | while read varname; do echo $varname; done 
+0

To jest dokładnie to, czego potrzebowałem do wyprowadzenia listy identyfikatorów okien (grepped i cut z wyjścia 'xwininfo') do' xdotool', dzięki czemu mogłem zamknąć kilka dialogów błędów, które pojawiły się. Ta składnia działa z Zsh :) – Desty

0

Jeśli Twój cp ma „-t” Flag (sprawdź na stronie man), który upraszcza sprawach trochę:

ls -SF | grep -v/| head -5 | xargs cp -t DIRECTORY 

polecenie find daje bardziej precyzyjną zdolność do uzyskania, co chcesz, zamiast ls | grep że masz. Chciałbym zakodować swoje pytanie tak:

find . -maxdepth 1 -type f -printf "%p\t%s\n" | 
sort -t $'\t' -k2 -nr | 
head -n 5 | 
cut -f 1 | 
xargs echo cp -t DIRECTORY 
+0

Sprawdziłem stronę man w moim systemie (macOS 10.12.1), a opcja -t nie wydaje się istnieć: '~ $ cp -t main.c main2.c cp : nielegalna opcja - t' –

+1

Myślę, że -t jest opcją GNU, a Mac nie jest GNU. –

Powiązane problemy