Ответ 1
Самый простой способ удалить что-либо из начала переменной - это использовать ${var#pattern}
.
$ FILENAME=.bashrc; echo "${FILENAME#.}"
bashrc
$ FILENAME=/etc/fstab; echo "${FILENAME#.}"
/etc/fstab
См. справочную страницу bash:
${параметр # слово}
${параметр ## слово}Слово расширяется для создания шаблона так же, как при расширении пути. Если шаблон совпадает с началом значения параметра, то результатом расширения является расширенное значение параметра с кратчайшим шаблоном соответствия ( "случай #" ) или самый длинный шаблон соответствия ( "случай ##" ).
Кстати, с более избирательной командой find
вам не нужно выполнять всю тяжелую работу. Вы можете иметь find
только совпадающие файлы с ведущей точкой:
find files/ -type f -name '.*'
Бросьте все вместе, затем:
find files/ -type f -name '.*' -printf '%P\0' |
while read -d $'\0' path; do
dir=$(dirname "$path")
file=$(basename "$path")
mv "$dir/$file" "$dir/${file#.}"
done
Дополнительные примечания:
-
Чтобы правильно обрабатывать имена файлов с пробелами, вам нужно указывать имена переменных, когда вы ссылаетесь на них. Напишите "$ file" вместо просто
$file
. -
Для дополнительной надежности
-printf '\0'
иread -d $'\0'
используют символы NUL в качестве разделителей, поэтому будут работать даже имена файлов со встроенными новыми строками'\n'
.