2016-05-02 1 views
0

Я новичок в концепции сценариев .. У меня есть требование, чтобы переименовать несколько файлов в директории как filename.sh.x в filename.shсценарий оболочки в список имен файлов один в каталоге и переименовать его

Сначала я попытался получить имена файлов в определенном каталоге .. поэтому я последовал следующий код сценариев

for entry in PathToThedirectory/*sh.x 
do 
    echo $entry 
done 

& код выше перечисленных вниз всех имен файлов с полным путем ..

Но мой ожидается, о/р является: получить файл имена в одиночку, как abc.sh.x, , так что я могу продолжить с раздельным механизмом струнного выполнить переименование операции легко ... помочь мне решить эту проблему ... Заранее спасибо

+1

Посмотрите на команду 'rename' и ее функцию регулярного выражения. – Cyrus

+1

Этот вопрос не имеет ничего общего с C. Удалите этот тег, пожалуйста. – tofro

+0

Я получил его .. спасибо u – sivakarthik

ответ

2

Первый подход пытается следовать OP предложения:

for i in my/path/*.py.x 
do 
    basename=$(basename "$i") 
    mv my/path/"$basename" my/path/"${basename%.*}" 
done 

И возможно, вы можете его упростить:

for i in my/path/*.py.x 
do 
    mv "$i" "${i%.*}"; 
done 

документации по данному виду операции (расширение параметров): https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

В частности:

$ {Параметр% слово}: Слово расширяется, чтобы получить шаблон так же, как в расширение имени файла.Если шаблон соответствует конечной части расширенного значения параметра, то результатом расширения является значение параметра с кратчайшим шаблоном соответствия (случай «%») или самый длинный шаблон соответствия (случай «%%») удален

Итак, ${i%.*} означает:

  • Возьмите $i
  • матча .* в конце его стоимости (. быть буквенным символом)
  • Удалить кратчайшие м Просмо тр шаблон
+2

Почему «может быть»? Второе решение выглядит намного чище для меня, не требует внешних инструментов и, вероятно, быстрее. –

+0

Ну, первое похоже на то, что просил OP («получить имена файлов в одиночку») ... но да, вы правы. – JoseKilo

+0

Ах, да, но «получить имена файлов в одиночку» было частью идеи, как решить проблему субоптимально;) Этот ответ также является единственным, насколько я вижу, что не требует внешних инструментов, кавычек правильно, не ломается для имен файлов со специальными символами, не удаляет неправильный материал ... хорошая работа. –

0

В KSH вы можете сделать это:

for $file in $(ls $path) 
do 
    new_file=$(basename $path/$file .x) 
    mv ${path}/${file} ${path}/${new_file} 
done 
+0

Я получил ответ .. спасибо u – sivakarthik

1

Посмотрите на prename (устанавливается вместе с пакетом perl на ubuntu). Тогда вы можете просто сделать что-то вроде:

prename 's/\.x$//' *.sh.x 
+0

Я получил его .. thank u – sivakarthik

0

Выполнение этой команды переименования из корневого каталога должно работать:

rename 's/\.sh\.x$/.sh/' *.sh.x 
+0

Файл 'abshcx.sh.x' будет переименован в' a.sh.sh.x' ... – anishsane

+0

Я получил его .. thank u – sivakarthik

+0

Спасибо anishsane. Обновлен ответ. – RaviTezu

0

Это должно сделать трюк:

for file in *.sh.x; 
do 
    mv "$file " "${file /.sh.x}"; 
done 
+0

Это удаляет '.sh.x' вместо просто '.x', и он не гарантирует, что удаляемая строка находится в конце имени файла. –

+0

Я получил его .. thank u – sivakarthik

-1

для г в ls -la /path|grep -v ^d|awk '{print $NF}'

сделать

эхо "basename $i" сделано

будет дать и основание имя всех файлов, или вы можете попробовать ниже

find/path-type f -exec basename {} \;

+0

Перед ответом plz, прочитайте его первым. http://stackoverflow.com/help/how-to-answer –

+0

Downvote: Совет такой же жестокий, как и форматирование. – tripleee