Удалите дублированные точки из имени файла

У меня есть dir с тоннами файлов внутри, которые назвали в уродливом таким как file..txt ,file2..txt , и т.д...

Таким образом, как легко удалить в эту секунду . от имен файлов?

Любой применимый метод ценится включая awk, sed, grep, и т.д...

1
задан 2 July 2015 в 15:35

7 ответов

Используя rename (согласно предложению heemayl я сузил globbing только к именам файлов, заканчивающимся точно ..txt):

rename -n 's/(.*)\./$1/' *..txt

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

, Если результатом является ожидаемый, удалите -n опция:

rename 's/(.*)\./$1/' *..txt
5
ответ дан 3 December 2019 в 06:18

Другой rename вариант:

rename 's/\Q.././' *..txt

использование \Q старается не выходить из точек (См. http://perldoc.perl.org/perlretut.html )

4
ответ дан 3 December 2019 в 06:18

Можно попробовать обратный порядок. Это работает, если имя файла содержит символы новой строки.

rename 's/\.([^.]+)$/$1/' *..txt
2
ответ дан 3 December 2019 в 06:18

У меня есть рабочее решение, все еще работающее на лучшее:

for f in *; do mv $f ${f%.txt}txt; done

Благодарность примечание @heemayl:

Вместо того, чтобы использовать *, используйте *..txt для получения файлов, поскольку только * вызовет проблему, когда у Вас есть любой файл без. и с только одним

Так становится:

for f in *..txt; do mv $f ${f%.txt}txt; done
4
ответ дан 3 December 2019 в 06:18

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

rename 's/\.+txt/\.txt/' *
2
ответ дан 3 December 2019 в 06:18

Имена файлов могут содержать символ новой строки, поэтому:

find . -maxdepth 1 -type f -print0 | while read -d  <час> 

Пример

$ find -exec  printf "%s ---" {} \;
. ---./foo
..txt ---./foo..txt ---

$ find . -maxdepth 1 -type f -print0 | \
    while read -d \0' f; do mv "$f" "${f%.txt}txt"; done

$ find -exec  printf "%s ---" {} \;
. ---./foo
.txt ---./foo.txt ---
\0' f; do mv "$f" "${f%.txt}txt"; done
<час>

Пример

$ find -exec  printf "%s ---" {} \;
. ---./foo
..txt ---./foo..txt ---

$ find . -maxdepth 1 -type f -print0 | \
    while read -d \0' f; do mv "$f" "${f%.txt}txt"; done

$ find -exec  printf "%s ---" {} \;
. ---./foo
.txt ---./foo.txt ---
1
ответ дан 3 December 2019 в 06:18

Это работает вполне хорошо, при отсутствии одно-точечных файлов:

for file in *; do mv "$file" "${file%%.*}${file#*.}"; done
1
ответ дан 3 December 2019 в 06:18

Другие вопросы по тегам:

Похожие вопросы: