передать вывод в качестве аргумента для cp в bash [duplicate]

Я знаю, что это было спрошено 8 лет назад, но в ES6 мы получили цикл для ... , который позволяет использовать стандартные функции прерывания:

for (let item of items) {
  if (item.id === id) {
    //do something cool
    break;
  }
}

29
задан Yamiko 18 May 2012 в 15:47
поделиться

4 ответа

Было бы:

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

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

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

cp `echo a b c` Directory

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

55
ответ дан Diego Sevilla 18 May 2012 в 15:47
поделиться

Если ваш 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
0
ответ дан glenn jackman 18 May 2012 в 15:47
поделиться

Я бы сделал:

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

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

ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory
33
ответ дан gpojd 18 May 2012 в 15:47
поделиться

Используйте обратные пометки `как это` или знак доллара $ (как этот) для выполнения подстановки команд. В основном это вставляет каждую строку стандартного вывода команды backticked в окружающую команду и запускает ее. Узнайте больше на man-странице bash в разделе «Подстановка команд».

Также, если вы хотите читать по одной строке за раз, вы можете читать отдельные строки из потока канала, используя синтаксис «while read»: ]

ls | while read varname; do echo $varname; done
6
ответ дан Brian Gordon 18 May 2012 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: