2016-03-25 8 views
2

Я пытаюсь написать команду bash, которая переименует все файлы в текущем каталоге, опуская последние 3 символа. Я не уверен, возможно ли, поэтому я спрашиваю здесь.Переименовать все файлы в каталоге, опуская последние 3 символа

У меня есть много файлов с именами, как это: 720-1458907789605.ts

Мне нужно переименовать все из них, опустив последние 3 символов, чтобы получить от 720-1458907789605.ts --->720-1458907789.ts для всех файлов в текущем каталоге.

Возможно ли использование команд bash? Я новичок в сценариях bash.

Спасибо!

ответ

1

Native решение Баша:

for f in *.ts; do 
    [[ -f "$f" ]] || continue # if you do not need to rename directories 
    mv "$f" "${f:: -6}.ts" 
done 

Это решение является медленным, если у вас есть очень много файлов: звезда-расширение for будет занимать память и время.

Ref: bash substring extraction.

Если у вас есть действительно большой набор данных, немного сложнее, но быстрее решение будет:

find . -type f -name '*.ts' -depth 1 -print0 | while read -d $\0 f; do 
    mv "$f" "${f%???.ts}.ts" 
done 
+0

У меня есть Баш скрипт так: место = «/ дом/VOD/canal3» кд $ location && найти. -maxdepth 1 -mmin +1 -type f -printf '% p \ 0% TF \ 0' | , в то время как IFS = read -rd '' file && read -d '' date; do mkdir -vp "$ date" && mv "$ file" "$ date" done – Chris

+0

он в основном создает папку, называет ее текущей датой и затем перемещает все файлы к ней. Мне нужно, прежде чем переходить или после этого переименовать файл, пропустив последние 3 символа. Как реализовать свое предложение в этом скрипте? – Chris

+1

Просто измените команду 'mv' на это:' mv '$ file "" $ date/$ {file% ???. Ts} .ts ". – gluk47

1

С переименованием Larry Wall «s:

rename -n 's/...\.ts$/.ts/' *.ts 

Если все выглядит нормально удалить вариант сухого запуска -n.