Расширяющиеся глобусы в xargs

7

У меня есть такой каталог

mkdir test
cd test
touch file{0,1}.txt otherfile{0,1}.txt stuff{0,1}.txt

Я хочу выполнить некоторую команду, такую ​​как ls, для определенных типов файлов в каталоге, и иметь расширение * (glob) для всех возможностей имени файла.

echo 'file otherfile' | tr ' ' '\n' | xargs -I % ls %*.txt

Эта команда не раскрывает глобус и пытается найти литерал 'file * .txt'

Как мне написать аналогичную команду, которая расширяет глобусы? (Я хочу использовать xargs, чтобы команда могла выполняться параллельно)

Craig
источник
В итоге я использовал два xargs с find:echo 'file otherfile' | tr ' ' '\n' | xargs -I % find . -name "%*.txt" | xargs ls
Крейг

Ответы:

12

Это старый, но я столкнулся с этой проблемой и нашел другой способ исправить это. Пусть xargs выполнит bash с -c и вашей командой. Например:

echo 'file otherfile' | tr ' ' '\n' | xargs -I % bash -c "ls %*.txt"

Это заставляет глобальное расширение.

axlerod
источник
2

То, что вы делаете, не сработает, потому что глобус не раскрывается командой xargs при запуске, он расширяется оболочкой, как только вы нажмете клавишу ввода и до того, как какая-либо из этих команд начнет выполняться. Итак, глобус, который он пытается расширить:

%*.txt

и так как нет файлов, соответствующих этому шаблону, он оставляет его в покое, а затем при запуске xargs подставляет свои аргументы в эту строку.

Самое простое решение, вероятно, состоит в том, чтобы просто написать шаблон, который соответствует всем интересующим вас файлам за один раз:

ls {file,otherfile}*.txt
TomH
источник
2

Я смог получить функциональность, которую хотел, используя -1флаг для ls. Вот как выглядит моя команда:

ls -1 {file,otherfile}*.txt | xargs -I% echo mycommand %
Дэйв Пэрриш
источник