Подтвердить что ты не робот

Pass output в качестве аргумента для cp в bash

Я беру класс unix/linux, и нам еще предстоит изучить переменные или функции. Мы только что узнали некоторые основные утилиты, такие как флаг и конвейер, вывод и добавление к файлу. В задании лаборатории он хочет, чтобы мы находили самые большие файлы и копировали их в каталог.

Я могу получить 5 самых больших файлов, но я не знаю, как передать их в cp одной командой

ls -SF | grep -v / | head -5 | cp ? Directory
4b9b3361

Ответ 1

Это будет:

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

предполагая, что конвейер верен. Backticks заменяют в строке вывод команд внутри него.

Вы также можете сделать свои тесты:

cp `echo a b c` Directory

скопирует все a, b и c в Directory.

Ответ 2

Я бы сделал:

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

xargs, вероятно, будет лучшим ответом.

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

Ответ 3

Используйте backticks `like this` или знак доллара $(например, этот) для выполнения подстановки команд. В основном это вставляет каждую строку стандартного вывода команды backticked в окружающую команду и запускает ее. Подробнее в bash manpage в разделе "Замена команд".

Кроме того, если вы хотите читать по одной строке за раз, вы можете читать отдельные строки из потока канала, используя синтаксис "while read":

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

Ответ 4

Если ваш cp имеет флаг "-t" (проверьте справочную страницу), это немного упростит ситуацию:

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