2015-06-12 3 views
2

У меня есть куча имен файлов типа:Удаление номера из файла

a-1.001.txt 
a-2.234.txt 
a-3.765.txt 

и так далее. Я хочу их быть:

a-1.txt 
a-2.txt 
a-3.txt 

Это все в unix. Я пытался с «переименовать», но я не могу заставить его работать с регулярными выражениями. (Я читал, что есть две версии, и у меня, вероятно, есть другой).

+2

Что произойдет, если 'a-1.001.txt' и' a-1.002.txt' существуют в одном каталоге? – pilcrow

+0

@pilcrow, которого не бывает. Я помещаю 1, но это даты, и есть файл за день. – coconut

ответ

1
for i in $(ls) ; do mv $i $(echo $i | awk -F '.' '{print $1"."$3}'); done 

Для изменения тестирования mv в echo.

PS: Был ли код с моей головы, но он должен работать. =)

+1

Вам не хватает ';' перед 'done'. Если вы хотите передать содержимое 'i' в' awk', тогда вы должны 'echo' его, так как команда' $ i' ничего не значит. Вы забыли добавить '.txt' в имя файла. Кроме того, вы захотите использовать '$ (ls)' вместо 'ls' или даже лучше,' $ (find. -maxdepth 1 -type f -regex ". *. Txt") '. ;-) – Peque

3

Предполагая, что вы знаете, как создать цикл для перебора всех имен файлов (или что вы собираетесь делать это вручную) и что для каждого файла, его имя хранится в FILE:

mv $FILE ${FILE%%.*}.txt 

Номер ${parameter%%pattern} idiom is standard shell syntax для удаления самого длинного кода соответствия pattern.

Смежные вопросы