У меня есть такой каталог
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, чтобы команда могла выполняться параллельно)
echo 'file otherfile' | tr ' ' '\n' | xargs -I % find . -name "%*.txt" | xargs ls
Ответы:
Это старый, но я столкнулся с этой проблемой и нашел другой способ исправить это. Пусть xargs выполнит bash с -c и вашей командой. Например:
Это заставляет глобальное расширение.
источник
То, что вы делаете, не сработает, потому что глобус не раскрывается командой xargs при запуске, он расширяется оболочкой, как только вы нажмете клавишу ввода и до того, как какая-либо из этих команд начнет выполняться. Итак, глобус, который он пытается расширить:
и так как нет файлов, соответствующих этому шаблону, он оставляет его в покое, а затем при запуске xargs подставляет свои аргументы в эту строку.
Самое простое решение, вероятно, состоит в том, чтобы просто написать шаблон, который соответствует всем интересующим вас файлам за один раз:
источник
Я смог получить функциональность, которую хотел, используя
-1
флаг дляls
. Вот как выглядит моя команда:источник