передать вывод в качестве аргумента для cp в bash [duplicate]
этот вопрос уже есть ответ здесь:
Я беру класс unix / linux, и нам еще предстоит изучить переменные или функции. Мы только что узнали некоторые основные утилиты, такие как флаг и конвейер, вывод и добавление в файл. В лаборатории он хочет, чтобы мы нашли самые большие файлы и скопировали их в каталог.
Я могу получить 5 самых больших файлов, но я не знаю, как передать их в cp в одной команде
ls -SF | grep -v / | head -5 | cp ? Directory
4 ответов
что будет:
cp `ls -SF | grep -v / | head -5` Directory
предполагая, что трубопровод является правильным. Обратные палочки заменяют в строке вывод команд внутри нее.
вы также можете сделать свои тесты:
cp `echo a b c` Directory
скопировать все a
, b
и c
на Directory
.
Я бы сделал:
cp $(ls -SF | grep -v / | head -5) Directory
xargs, вероятно,будет лучшим ответом.
ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory
используйте backticks ' like this` или знак доллара $(like this) для выполнения подстановки команд. В основном это вставляет каждую строку стандартного вывода команды backticked в окружающую команду и запускает ее. Узнайте больше в bash manpage в разделе " замена команд."
кроме того, если вы хотите читать по одной строке за раз, вы можете читать отдельные строки из потока трубы, используя синтаксис "while read":
ls | while read varname; do echo $varname; done
если cp
имеет флаг"- t " (проверьте man-страницу), что немного упрощает дело:
ls -SF | grep -v / | head -5 | xargs cp -t DIRECTORY
команда find дает вам более мелкозернистую возможность получить то, что вы хотите, а не ls | grep
что у вас есть. Я бы закодировал ваш вопрос так:
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