unix / macos - как найти все файлы и скопировать их на место с другим расширением - PullRequest
0 голосов
/ 13 сентября 2018

Итак, я хочу получить все определенные файлы, а затем скопировать их в одну папку / папку, но с другим расширением. Пока у меня есть это из другого вопроса Скопируйте все файлы с определенным расширением из всех подкаталогов :

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

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018
find . -name \*.js | while read jsfile; do cp "${jsfile}" "${jsfile%.js}.ts"; done
  1. find . -name \*.js перечисление всех .js файлов
  2. с использованием команды read для чтения каждой строки из вывода команды fine.
  3. ${jsfile%.js} означает удаление суффикса .js из переменной jsfile, например, a/functions.js станет a/functions
0 голосов
/ 13 сентября 2018

Вот как можно назначить переменные, используя 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'
...