Поэтому я хочу захватить все определенные файлы, а затем скопировать их в той же папке / месте, но с другим расширением. Пока у меня это из другого вопроса Скопируйте все файлы с определенным расширением из всех подкаталогов:
find . -name \*.js -exec cp {} newDir \;
Я хочу скопировать все эти файлы .js
в .ts
, например. дублируйте functions.js
в functions.ts
, где бы он ни находился.
больше примеров:
a/functions.js
b/test.js
c/another.js
index.js
к
a/functions.ts
b/test.ts
c/another.ts
index.ts
Вот как назначать переменные с помощью find
и xargs
и открывать всевозможные параметры командной строки,
$ find . -name '*.js' | xargs -I {} bash -c 'p = "{}"; cp $p newDir/$(basename ${p%.js}.ts)'
Используйте xargs -I {}
, чтобы получить вывод find
в качестве ввода для xargs
. Используйте bash -c
для выполнения команды.
Вот демонстрация:
$ mkdir -p a b c d newDir
$ touch a/1.js b/2.js c/three.js d/something.js
$ find . -name '*.js' | xargs -I {} bash -c 'p = "{}"; cp $p newDir/$(basename ${p%.js}.ts)'
$ ls newDir/
1.ts 2.ts something.ts three.ts
РЕДАКТИРОВАТЬ (вопрос изменен после нескольких часов после первоначальной публикации). Чтобы сохранить дубликат в том же каталоге, используйте ту же команду cp
и удалите newDir
и basename
:
$ find . -name '*.js' | xargs -I {} bash -c 'p = "{}"; cp $p ${p%.js}.ts'
см. мой обновленный комментарий. Достаточно простая модификация моего первоначального ответа даст вам желаемый результат.
find . -name \*.js | while read jsfile; do cp "${jsfile}" "${jsfile%.js}.ts"; done
find . -name \*.js
список всех файлов .js
read
, чтобы прочитать каждую строку из вывода команды fine
.${jsfile%.js}
означает удаление суффикса .js
из переменной jsfile
, например, a/functions.js
превратится в a/functions
.Не могли бы вы написать объяснение того, что делает каждая часть? Хотя ответ правильный.
Чтобы уточнить, эта команда была примером из другого вопроса, я хочу, чтобы результат оставался в соответствующих папках. Я добавил к своему вопросу более подробный пример, спасибо.