Изменение строки замены в xargs

Когда я использую xargs, иногда мне не нужно явно использовать заменяющую строку строка:

find . -name "*.txt" | xargs rm -rf

В других случаях я хочу указать заменяющую строку, чтобы делать такие вещи, как:

find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar

Предыдущая команда перемещала все текстовые файлы в текущем каталоге в /foo, и это добавит расширение barко всем файлам.

Если вместо добавления какого-либо текста к строке замены я хочу изменить эту строку так, чтобы я мог вставить некоторый текст между именем и расширением файлы, как я могу это сделать?Например, допустим, я хочу сделать то же самое, что и в предыдущем примере, но файлы должны быть переименованы/перемещены из <имя>.txtв / foo/.bar.txt(вместо /foo/.txt.bar).

UPDATE: мне удалось найти решение:

find . -name "*.txt" | xargs -I{} \
    sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
           mv "$1" "foo/${name}.bar.${ext}"' -- {}

Но мне интересно, есть ли более короткое/лучшее решение ион.

48
задан betabandido 29 May 2012 в 20:05
поделиться