У меня есть dir с тоннами файлов внутри, которые назвали в уродливом таким как file..txt
,file2..txt
, и т.д...
Таким образом, как легко удалить в эту секунду .
от имен файлов?
Любой применимый метод ценится включая awk, sed, grep, и т.д...
Используя rename
(согласно предложению heemayl я сузил globbing только к именам файлов, заканчивающимся точно ..txt
):
rename -n 's/(.*)\./$1/' *..txt
Это будет соответствовать имени файла до последней точки и заменять соответствие всем кроме последней точки.
, Если результатом является ожидаемый, удалите -n
опция:
rename 's/(.*)\./$1/' *..txt
Другой rename
вариант:
rename 's/\Q.././' *..txt
использование \Q
старается не выходить из точек (См. http://perldoc.perl.org/perlretut.html )
Можно попробовать обратный порядок. Это работает, если имя файла содержит символы новой строки.
rename 's/\.([^.]+)$/$1/' *..txt
У меня есть рабочее решение, все еще работающее на лучшее:
for f in *; do mv $f ${f%.txt}txt; done
Благодарность примечание @heemayl:
Вместо того, чтобы использовать *, используйте *..txt для получения файлов, поскольку только * вызовет проблему, когда у Вас есть любой файл без. и с только одним
Так становится:
for f in *..txt; do mv $f ${f%.txt}txt; done
Очень простой способ сделать это просто выполняет следующую команду в каталоге, который содержит имена файлов в формате u, упомянутом выше
rename 's/\.+txt/\.txt/' *
Имена файлов могут содержать символ новой строки, поэтому:
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 ---
Это работает вполне хорошо, при отсутствии одно-точечных файлов:
for file in *; do mv "$file" "${file%%.*}${file#*.}"; done