2015-10-04 7 views
0

Я просто хочу изменить суффикс файлов, но это не сработает! командной строки я, как показано ниже:Команда командной строки xargs & sed не работает

ls *html | xargs -I{} echo "\`echo {} | sed 's/html/css/g'\`" 

Однако, когда я использовал ls *html, он показывает:

file1.html file2.html file3.html file4.html file5.html 

используется ls *html | sed 's/html/css/g', он показывает, как я ожидал! так:

file1.css file2.css file3.css file4.css file5.css 

Я работаю на Mac OS. Может ли кто-нибудь дать мне несколько предложений? Thans заранее.

+3

Где вы на самом деле переименовать/переместить файлы на диске? –

ответ

4

Поскольку обратные кавычки находятся в двойных кавычках, он запускается сразу же оболочкой, а не по xargs для каждого файла.

Результат такой же, как

ls *html | xargs -I{} echo "{}" 

Однако, если вы используете одинарные кавычки, вы столкнетесь с другими проблемами. Вы в конечном итоге, сделать что-то вроде этого:

ls *html | xargs -I{} sh -c 'echo `echo {} | sed '\''s/html/css/g'\''`' 

но получает быть беспорядок, и мы даже не дошли до фактического переименовании еще.

Использование цикла немного лучше:

for file in *html; do 
    newname=${file%html}css 
    mv "$file" "$newname" 
done 
+4

Чтобы избежать ненужного конвейера и работать нормально, даже если 'file' содержит символьную строку' html' более одного раза, рассмотрите возможность замены 'newname = \' echo '$ file "| sed 's/html/css/g' \ '' с 'newname = $ {file% html} css'. – John1024

+0

Большое спасибо. Я получил его. И то же спасибо @ John1024 – enoder

0

Использование GNU Parallel:

ls *html | parallel echo before {} after {.}.css 
Смежные вопросы