Когда я использую xargs
, иногда мне не нужно явно использовать заменяющую строку:
find . -name "*.txt" | xargs rm -rf
В других случаях я хочу указать заменяющую строку, чтобы сделать что-то вроде:
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
Предыдущая команда переместила бы все текстовые файлы под текущим каталогом в /foo
и добавит расширение bar
ко всем файлам.
Если вместо добавления некоторого текста в строку replace мне нужно изменить эту строку, чтобы я мог вставить текст между именем и расширением файлов, как я мог это сделать? Например, скажем, я хочу сделать то же, что и в предыдущем примере, но файлы следует переименовать/переместить из <name>.txt
в /foo/<name>.bar.txt
(вместо /foo/<name>.txt.bar
).
ОБНОВЛЕНИЕ: мне удается найти решение:
find . -name "*.txt" | xargs -I{} \
sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
mv "$1" "foo/${name}.bar.${ext}"' -- {}
Но мне интересно, есть ли более короткое/лучшее решение.