У меня есть куча файлов .txt в каталоге, и я хочу иметь возможность найти эти файлы и удалить расширение из имени файла.
Я могу найти файлы , используя:
$ find . -maxdepth 1 -type f -name "*.txt"
./0test.txt
./1test.txt
./2test.txt
./3test.txt
./4test.txt
./5test.txt
./6test.txt
./7test.txt
./8test.txt
./9test.txt
Затем я попытался использовать команду sed, чтобы удалить расширение «.txt» , например:
find . -maxdepth 1 -type f -name "*.txt" | sed "s/\.txt$//"
Но Я просто получаю имена файлов, перечисленные без их расширений , а фактические имена файлов остаются неизменными .
Итак как ] вы действительно меняете сами имена файлов ?
Как насчет этого в bash
for v in *.txt ; do mv "$v" "$(basename "$v" .txt)"; done
$
в регулярном выражении соответствует концу строки, вы не можете сопоставить символы после этого, только до.
Также
нужно экранировать, чтобы он не имел специального значения (любой символ).
Итак:
find . -maxdepth 1 -type f -name "*.txt" | sed "s/\.txt$//"
Если вы пытаетесь переименовать файлы, то вы можете использовать ту же подстановку регулярных выражений с помощью команды rename
на языке perl
rename "s/\.txt$//" *.txt
(вам не нужен find
, когда все файлы находятся на одном уровне каталога), или простой цикл оболочки с mv
:
for f in *.txt; do mv -n -- "$f" "${f%.txt}"; done