4

Я хочу повторить

touch ../template/filename

где filename происходит от find . Я хочу, чтобы xargs применил операцию touch , но я не хочу, чтобы она вставляла пробел, как это обычно делается, который получается из:

touch ../template/ filename

Вот моя неполная команда. Как мне это сделать?

find *.html | xargs touch ../template/WHAT-NOW

3 ответа3

9
find -name "*.html" | xargs -d"\n" -I"{}" touch ../template/{}

find -name "*.html" -exec touch ../template/{} \;

Обратите внимание, что find *.html неверен, так как подстановочные знаки раскрываются перед выполнением команды.

3

Это легче написать как цикл оболочки. Например, в оболочке C вы можете написать:

foreach i (`find -name "*.html"`)
   touch ../template/$i
end

И вот это в bash:

for i in `find -name "*.html"`
do
   touch ../template/$i
done

И в моей оболочке Hamilton C (полное раскрытие: я автор) я добавил подстановочный знак «...» в обход дерева, чтобы вы могли написать:

foreach i (.../*.html)
   touch ../template/$i
end
0

Попробуйте вместо этого использовать GNU Parallel. Таким образом, вы избежите неприятных сюрпризов, если имена файлов содержат пробел 'или ":

find *.html | parallel -X touch ../template/{/}

Посмотрите вступительные видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

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