6

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

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, чтобы команда могла выполняться параллельно)

3 ответа3

9

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

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

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

2

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

%*.txt

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

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

ls {file,otherfile}*.txt
0

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

ls -1 {file,otherfile}*.txt | xargs -I% echo mycommand %

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .