Это будет безопасно обрабатывать имена файлов.
#!/bin/bash
shopt -s extglob # see http://mywiki.wooledge.org/glob
for file in note!(*.txt); do
mv -i "$file" "$HOME/notes/$file.txt"
done
mv -i note*.txt "$HOME/notes/"
Если вы хотите нечувствительность к регистру, также включите опцию оболочки nocaseglob.
shopt -s extglob nocaseglob [!d2 ]
EDIT: Другой подход
#!/bin/bash
for file in note*; do
# Make sure it's a regular file and not the destination directory
[[ -f $file && ! $file -ef $HOME/notes ]] || continue
mv -i "$file" "$HOME/notes/${file%.[Tt][Xx][Tt]}.txt"
done
В дополнение к запросу steeldriver, поскольку подстрока, которая должна быть исключена, одинакова для всех файлов, вы можете использовать операцию замещения расширения параметра bash:
for file in *.time; do echo "${file/.time/}"; done | sort -n > file.txt
Это заменит [ f5] с пустой строкой, т. е. .time исключается из имен файлов.
Синтаксис операции подстановки -
${Parameter/OLD/NEW}
Это заменит только первое вхождение OLD с NEW, если вы хотите, чтобы все вхождения OLD были заменены на NEW:
${Parameter//OLD/NEW}
Итак, вы просто хотите числа и не хотите .time. Мои два цента здесь:
ls /path/to/*.time | cut -d '.' -f1 > toSomeFile.txt
Выполняйте то же самое с помощью команд find и basename следующим образом:
find /path/to/dir -name '*.time' -exec basename {} .time \; > someFile
basename {} .time, удаляет суффикс «.time» из fileNames. [F4] представляют текущее найденное имя файла.